Visual Basic 编码约定

Microsoft 开发的示例和文档符合本主题中的准则。 如果您遵循相同的编码约定,您可能会得到以下好处:

  • 代码将具有一致的外观,以便读者可以更多地关注内容而非布局。

  • 读者能够根据以前的经验作出假设,从而更加快速地理解代码。

  • 您可以更轻松地复制、更改和维护代码。

  • 您可以帮助确保您的代码演示的是 Visual Basic 的“最佳实践”。

命名约定

  • 有关命名指南的信息,请参见 Guidelines for Names 主题。

  • 请不要在变量名中使用“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
    

语言指南

String 数据类型

  • 要连接字符串,请使用与号 (&)。

    MsgBox("hello" & vbCrLf & "goodbye")
    
  • 若要将字符串追加到循环,请使用 StringBuilder 对象。

    Dim longString As New System.Text.StringBuilder
    For count As Integer = 1 To 1000
      longString.Append(count)
    Next
    

事件处理程序中的宽松委托

不要将参数(对象和 EventArgs)显式限定到事件处理程序。 如果不使用传递给事件的事件参数(例如,发送方为对象,e 为 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 关键字而非 Not...Is Nothing。

New 关键字

  • 使用短实例化。 例如,使用以下语句:

    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 (null),在调用 RaiseEvent 方法前。 RaiseEvent 会在引发事件之前检查是否存在 Nothing。

使用共享成员

使用类名称调用 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,请重命名它们而不是在结果中保留它们的 Name 和 ID 形式:

    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
    

请参见

其他资源

代码安全维护指南