Поделиться через


Соглашения о написании кода в Visual Basic

Обновлен: Июль 2008

Для разработки примеров и документации корпорация Microsoft использует следующие правила. Спецификация языка Visual Basic не определяет стандарт написания кода.

  • Соглашения для кода создают согласованный вид кода, позволяющий читателям сосредоточиться на содержимом, а не на макете.

  • Соглашения позволяют читателям понять код быстрее, поскольку они дают возможность им сделать предположения, основанные на опыте.

  • Соглашения делают копирование, изменение и обслуживание кода проще.

  • Соглашения демонстрируют "лучшие рекомендации" Visual Basic.

Обсуждение

Соглашения об именах

  • Правила именования рассматриваются в Руководство по разработке библиотек классов.

  • Нет необходимости изменять имена объектов, созданных конструктором Visual Studio, чтобы сделать их соответствующими рекомендациям.

  • Использование полных именований пространств имен предпочтительнее, чем добавление инструкции Imports. Если пространство имен импортировано в проект по умолчанию, то не требуется указывать полные имена в коде, поскольку он будет выполняться с неполным именем с использованием IntelliSense, когда копируется и вставляется. При разбиении длинных строк кода, чтобы облегчить их чтение, полные имена могут быть разорваны после "." Например:

    Dim collection As System.Diagnostics. _
           InstanceDataCollectionCollection
    
  • Не используйте "Mу" или "mу" как часть имени переменной. При этом создается путаница с My объектами.

Cоглашения о расположении

Для хорошего расположения используется форматирование, чтобы выделить структуру кода и облегчить чтение кода.

  • Используйте красивое оформление для форматирования исходного кода с помощью исходных параметров (разумные отступы, 4 знака отступа, сохранение табуляции в качестве пробелов). Дополнительные сведения см. в разделе Страница "Только для VB", папка "Basic", папка "Текстовый редактор", диалоговое окно "Параметры".

  • Используйте только одну инструкцию в строке. Не используйте в Visual Basic символ продолжения строки (:).

  • Используйте только одно объявление в строке.

  • Если красивое оформление не форматируйте продолжение строк, отступ продолжения строки должен быть одним символом табуляции.

  • Добавьте по крайней мере одну пустую строку между определениями методов и свойств.

Соглашения о комментариях

  • Не используйте комментарии в конце строки кода. Поместите комментарии на отдельной строке.

  • Начинайте текст комментария с буквы верхнего регистра.

  • Завершайте комментарий точкой.

  • Вставьте один пробел между разделителем комментария (') и текстом комментария.

    ' 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
    

Вывод типа

Используйте преимущества вывода типов для локальных переменных:

Public Sub GetQuery()
  Dim filterValue = "London"
  Dim query = From customer In customers _
              Where customer.Country = filterValue
End Sub

Ослабленные делегаты в обработчиках событий

Используйте ослабленные делегаты и пропускайте аргументы событий, если в коде не используются аргументы событий:

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 letters3() As String = {"a", "b", "c"}
    

    Вместо этого:

    Dim letters4 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

Используйте определение типа для переменных цикла в операторах For и For Each

Позволяет определение типа для определения типа ограниченной переменной в цикле.

Далее приведен пример, в котором используется определение типа в операторе For:

For count = 0 To 2
  MsgBox(names(count))
Next

Далее приведен пример, в котором используется определение типа в операторе For Each:

For Each name In names
  MsgBox(name)
Next

Использование операторов Try...Catch и Using для обработки исключений

  • Не используйте On Error Goto.

  • Чтобы обработать исключения, используйте оператор Try...Catch:

    Dim conn As New SqlConnection("connection string")
    Try
      Conn.Open()
    Catch ex As SqlException
    
    Finally
      Conn.Close()
    End Try
    
  • Оператор Using сочетает оператор Try...Catch с вызовом метода Dispose и упрощением кода. Если используется оператор Try...Catch и только код в блоке Finally делает вызов метода Dispose, используйте вместо этого оператор Using.

    Using redPen As New Pen(color.Red)
      ' Insert code here.
    End Using
    

Используйте ключевое слово IsNot

Используйте ключевое слово IsNot в ссылке к Not...Is Nothing.

Используйте ключевые слова AndAlso и OrElse

Чтобы избежать исключений и увеличить производительность, пропуская код, не являющийся необходимыми, используйте AndAlso вместо And и OrElse вместо Or при выполнении сравнений:

' Avoid a null reference exception. If the left side of the AndAlso 
' operator is False, the right side is not evaluated and a null 
' exception is not thrown.
If nullableObject IsNot Nothing AndAlso nullableObject = testValue Then

End If

' Avoid an unnecessary resource-intensive operation. If the left side
' of the OrElse operator is True, the right side is not evaluated and 
' a resource-intensive operation is not called.
If testCondition OrElse ResourceIntensiveOperation() Then

End If

Экземпляры форм по умолчанию

Используйте Form1.ShowDialog вместо My.Forms.Form1.ShowDialog.

Ключевое слово 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 WhatHappened(ByVal source As Object, _
                              ByVal e As WhatHappenedEventArgs)
    
  • Не проверяйте, возникает ли событие Nothing перед вызовом метода RaiseEvent. RaiseEvent проверит Nothing перед тем, как он вызовет событие.

Использование общих членов

Вызывайте Shared члены с помощью имени класса, а не переменной экземпляра.

Используйте функцию MsgBox

Используйте MsgBox вместо MessageBox.Show или Console.WriteLine. В среде, которая не поддерживает функции MsgBox, такие как Silverlight, используйте соответствующие альтернативы.

Использование My пространство имен

Использование возможности My предпочтительнее, чем библиотеки классов платформы .NET Framework или библиотеки времени выполнения Visual Basic. Дополнительные сведения см. в разделе Объекты (Visual Basic).

Использование 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
    
  • Переименуйте свойства, если имена свойств в результате могут быть неоднозначными. Например, если запрос возвращает имя клиента и идентификатор заказа, то не оставляйте их имена в виде 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" _
                            Select cust.LastName, cust.CompanyName
    
  • Используйте предложение Join для явного определения соединения вместо использования предложения Where для неявного определения соединения:

    Dim customerList2 = From cust In customers _
                        Join order In orders _
                          On cust.CustomerID Equals order.CustomerID _
                        Select cust, order
    

Используйте члены библиотеки времени выполнения Visual Basic

Использование возможности библиотеки времени выполнения Visual Basic предпочтительнее, чем библиотеки классов платформы .NET Framework.

Рекомендации к примерам

Общие

  • Следуйте указаниям, изложенным в правилах проектирования для разработчиков библиотеки классов.

  • Укажите подсказку и заголовок MsgBox вызова.

  • Используйте файлы ресурсов при необходимости.

  • Используйте Option Strict On либо в каждом файле, либо в качестве параметра проекта.

  • Компилируйте с включенными предупреждениями.

  • Определяйте только один Class, Structure или Interface в файле.

  • Используйте кодировки по умолчанию при сохранении файлов.

Локализация

  • Используйте свойство AutoSize там, где это возможно.

  • Не скрывайте и не перекрывайте элементы управления.

  • Не выравнивайте элементы управления для создания предложения.

  • Не следует строить строки путем удаления знаков из другой строки.

  • Используйте культурно-нейтральную графику.

  • Используйте только шрифты Tahoma или MS Sans Serif.

Доступность

  • Используйте цвета из вкладки Система диалогового окна выбора цвета.

  • Используйте быстрые сочетания клавиш для всех меню, меток, кнопки и т. д.

  • Задайте свойства элемента управления, как описано в следующей таблице.

Свойство

Параметр

AccessibleDescription

Описание элемента.

AccessibleName

Имя элемента.

AccessibleRole

По умолчанию, или сбросьте это свойство, если элемент управления имеет другую роль.

TabIndex

Задайте в логическом порядке.

Text

Все элементы управления, выбираемые с помощью мыши, должны иметь сочетания горячих клавиш для клавиатуры.

Font Size

По умолчанию или задайте для 10 или более точек

Forecolor

Значение по умолчанию

Backcolor

Значение по умолчанию

BackgroundImage

По умолчанию

Безопасность

Следуйте указаниям, изложенным в Правила написания безопасного кода.

См. также

Другие ресурсы

Руководство по разработке библиотек классов

Правила написания безопасного кода

Журнал изменений

Дата

Журнал изменений

Причина

Июль 2008

Обновлены правила включения новых возможностей языка, включая LINQ, XML-литералы, инициализаторы объектов, определение типов и ослабленные делегаты.

Исправление ошибки содержимого.