Соглашения о написании кода в 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-литералы, инициализаторы объектов, определение типов и ослабленные делегаты. |
Исправление ошибки содержимого. |