Microsoft开发遵循本主题中的准则的示例和文档。 如果遵循相同的编码约定,可能会获得以下优势:
代码外观一致,以便读者可以更好地专注于内容,而不是布局。
读者可以更快地理解代码,因为它们可以根据以前的体验做出假设。
可以更轻松地复制、更改和维护代码。
您帮助确保您的代码展示了 Visual Basic 的“最佳实践”。
命名约定
有关命名准则的信息,请参阅 命名准则 主题。
不要将“My”或“my”用作变量名称的一部分。 这种做法会混淆
My
对象。无需更改自动生成的代码中的对象名称,使其符合准则。
布局约定
插入制表符作为空格,并使用具有四个空格缩进的智能缩进。
使用代码的整齐排列(重格式化)在代码编辑器中重新格式化你的代码。 有关详细信息,请参阅“选项”、“文本编辑器”、“基本”(Visual Basic)。
每行只使用一条语句。 请勿使用 Visual Basic 行分隔符 (
:
)。避免使用显式行延续字符“
_
”,转而使用隐式行延续,只要语言允许它。每行只使用一个声明。
如果代码的整齐排列(重格式化)不会自动设置延续行的格式,请手动将延续行缩进一个制表位。 但是,始终在列表中使项左对齐。
a As Integer, b As Integer
在方法和属性定义之间至少添加一个空白行。
注释约定
将注释放在单独的行上,而不是放在代码行的末尾。
使用大写字母开始注释文本,并使用句点结束注释文本。
在注释分隔符 (
'
) 和注释文本之间插入一个空格。' Here is a comment.
请勿在注释周围使用格式化的星号块。
程序结构
在使用
Main
方法时,请为新的控制台应用程序使用默认构造,并将My
用于命令行参数。Sub Main() For Each argument As String In My.Application.CommandLineArgs ' Add code here to use the string variable. Next End Sub
语言指南
字符串数据类型
使用字符串内插来连接短字符串,如下面的代码所示。
MsgBox($"hello{vbCrLf}goodbye")
若要在循环中追加字符串,请使用对象 StringBuilder 。
Dim longString As New System.Text.StringBuilder For count As Integer = 1 To 1000 longString.Append(count) Next
事件处理程序中的宽松委托
不要将参数 (Object
和 EventArgs
) 显式限定为事件处理程序。 如果不使用传递给事件的事件参数(例如 sender As Object
, e As EventArgs
),请使用宽松的委托,并省略代码中的事件参数:
Public Sub Form1_Load() Handles Form1.Load
End Sub
未签名数据类型
- 使用
Integer
而非无符号类型,除非它们是必需的。
数组
在声明行上初始化数组时,请使用短语法。 例如,使用以下语法。
Dim letters1 As String() = {"a", "b", "c"}
不要使用以下语法。
Dim letters2() As String = New String() {"a", "b", "c"}
将数组设计器放在类型上,而不是放在变量上。 例如,使用以下语法:
Dim letters4 As String() = {"a", "b", "c"}
请勿使用以下语法:
Dim letters3() As String = {"a", "b", "c"}
声明和初始化基本数据类型的数组时,请使用 { } 语法。 例如,使用以下语法:
Dim letters5 As String() = {"a", "b", "c"}
请勿使用以下语法:
Dim letters6(2) As String letters6(0) = "a" letters6(1) = "b" letters6(2) = "c"
使用 With 关键字
对一个对象进行一系列调用时,请考虑使用 With
关键字:
With orderLog
.Log = "Application"
.Source = "Application Name"
.MachineName = "Computer Name"
End With
使用异常处理时使用 Try...Catch 和 Using 语句
请勿使用 On Error Goto
。
使用 IsNot 关键字
使用 ... IsNot Nothing
而不是 Not ... Is Nothing
。
新建关键字
使用短实例化。 例如,使用以下语法:
Dim employees As New List(Of String)
前面的行等效于以下代码:
Dim employees2 As List(Of String) = New List(Of String)
使用对象初始化代替无参数构造函数来创建新对象:
Dim orderLog As New EventLog With { .Log = "Application", .Source = "Application Name", .MachineName = "Computer Name"}
事件处理
使用
Handles
而不是AddHandler
:Private Sub ToolStripMenuItem1_Click() Handles ToolStripMenuItem1.Click End Sub
使用
AddressOf
,并且请勿显式实例化委托:Dim closeItem As New ToolStripMenuItem( "Close", Nothing, AddressOf ToolStripMenuItem1_Click) Me.MainMenuStrip.Items.Add(closeItem)
定义事件时,请使用短语法,让编译器定义委托:
Public Event SampleEvent As EventHandler(Of SampleEventArgs) ' or Public Event SampleEvent(ByVal source As Object, ByVal e As SampleEventArgs)
在调用
Nothing
该方法之前,请勿验证事件是否为RaiseEvent
null。RaiseEvent
在引发事件之前会检查是否为Nothing
。
使用 Shared 成员
使用类名而不是从实例变量调用 Shared
成员。
使用 XML 文本
XML 文本简化了使用 XML 时遇到的最常见任务(例如,加载、查询和转换)。 使用 XML 进行开发时,请遵循以下准则:
使用 XML 文本创建 XML 文档和片段,而不是直接调用 XML API。
在文件或项目级别导入 XML 命名空间,以利用 XML 文本的性能优化。
使用 XML 轴属性访问 XML 文档中的元素和属性。
使用嵌入表达式包含值,以及从现有值创建 XML,而不是使用 API 调用,例如
Add
方法:Private Function GetHtmlDocument( ByVal items As IEnumerable(Of XElement)) As String Dim htmlDoc = <html> <body> <table border="0" cellspacing="2"> <%= From item In items Select <tr> <td style="width:480"> <%= item.<title>.Value %> </td> <td><%= item.<pubDate>.Value %></td> </tr> %> </table> </body> </html> Return htmlDoc.ToString() End Function
LINQ 查询
对查询变量使用有意义的名称:
Dim seattleCustomers = From cust In customers Where cust.City = "Seattle"
为查询中的元素提供名称,确保匿名类型的属性名称是使用 Pascal 大小写格式正确大写的:
Dim customerOrders = From customer In customers Join order In orders On customer.CustomerID Equals order.CustomerID Select Customer = customer, Order = order
如果结果中的属性名称模棱两可,请对属性重命名。 例如,如果查询返回的是客户名称和订单 ID,请重命名它们,而不是在结果中将它们保留为占位符 c0 和 c1。
Dim customerOrders2 = From cust In customers Join ord In orders On cust.CustomerID Equals ord.CustomerID Select CustomerName = cust.Name, OrderID = ord.ID
在查询变量和范围变量的声明中使用类型推理:
Dim customerList = From cust In customers
对齐
From
语句下的查询子句:Dim newyorkCustomers = From cust In customers Where cust.City = "New York" Select cust.LastName, cust.CompanyName
在其他查询子句之前使用
Where
子句,以便后续查询子句对筛选后的数据集进行操作。Dim newyorkCustomers2 = From cust In customers Where cust.City = "New York" Order By cust.LastName
使用
Join
子句显式定义联接作,而不是使用该Where
子句隐式定义联接作:Dim customerList2 = From cust In customers Join order In orders On cust.CustomerID Equals order.CustomerID Select cust, order