Codierungskonventionen in Visual Basic
Aktualisiert: Juli 2008
Diese folgenden Richtlinien werden von Microsoft für die Entwicklung von Beispielen und Dokumentation verwendet. In der Programmiersprachenspezifikation von Visual Basic wird kein Codierungsstandard definiert.
Codierungskonventionen sorgen für eine konsistente Gestaltung des Codes, damit sich die Leser auf den Inhalt, nicht auf das Layout konzentrieren.
Konventionen erleichtern den Lesern das Verständnis des Codes, denn sie können bei Annahmen auf vorherige Erfahrungen zurückgreifen.
Konventionen erleichtern das Kopieren, Ändern und Pflegen des Codes.
Konventionen veranschaulichen "empfohlene Vorgehensweisen" von Visual Basic.
Erörterung
Namenskonventionen
Benennungsrichtlinien werden in Entwurfsrichtlinien zum Entwickeln von Klassenbibliotheken behandelt.
Sie müssen den Namen von Objekten, die mit den Designertools von Visual Studio erstellt wurden, nicht ändern, um sie an die Richtlinien anzupassen.
Verwenden Sie Namespacequalifikationen, statt Imports-Anweisungen hinzuzufügen. Wenn ein Namespace standardmäßig in ein Projekt importiert wird, müssen Sie den Code nicht voll qualifizieren, da er mit IntelliSense beim Kopieren und Einfügen unqualifiziert ausgeführt wird. Wenn Sie lange Codezeilen umbrechen, damit sie besser lesbar werden, können qualifizierte Namen nach dem "." umbrochen werden. Beispiel:
Dim collection As System.Diagnostics. _ InstanceDataCollectionCollection
Verwenden Sie nicht "My" oder "my" als Teil eines Variablennamens. Dies führt zu Verwechslungen mit den My-Objekten.
Layoutkonventionen
Gutes Layout zeichnet sich durch Formatierungen aus, die die Struktur des Codes hervorheben, und verbessert die Lesbarkeit des Codes.
Verwenden Sie das Feature zur automatischen Strukturierung, um Code mit den Standardeinstellungen zu formatieren (intelligente Einzüge, Einzüge um vier Zeichen, Tabulatoren als Leerzeichen speichern). Weitere Informationen finden Sie unter VB-spezifisch, Basic, Text-Editor, Dialogfeld "Optionen".
Verwenden Sie pro Zeile nur eine Anweisung. Verwenden Sie nicht das Visual Basic-Zeilenfortsetzungszeichen (:).
Verwenden Sie pro Zeile nur eine Deklaration.
Wenn Fortsetzungszeilen durch die automatische Strukturierung nicht formatiert werden, können Sie diese um einen Tabstopp einrücken.
Fügen Sie zwischen Methoden- und Eigenschaftendefinitionen mindestens eine Leerzeile ein.
Konventionen für Kommentare
Verwenden Sie keine Kommentare am Ende einer Codezeile. Schreiben Sie Kommentare in eine eigene Zeile.
Fangen Sie den Kommentartext mit einem Großbuchstaben an.
Beenden Sie den Kommentar mit einem Punkt.
Fügen Sie ein Leerzeichen zwischen dem Kommentartrennzeichen (') und dem Kommentartext ein.
' Here is a comment.
Erstellen Sie keine formatierten Blöcke von Sternchen, die die Kommentare umgeben.
Programmstruktur
Wenn Sie die Main-Methode verwenden, verwenden Sie das Standardkonstrukt für neue Konsolenanwendungen, und verwenden Sie My für Befehlszeilenargumente.
Sub Main() For Each argument As String In My.Application.CommandLineArgs ' Add code here to use the string variable. Next End Sub
Sprachrichtlinien
String-Datentyp
Verwenden Sie & zum Verketten von Zeichenfolgen:
MsgBox("hello" & vbCrLf & "goodbye")
Verwenden Sie das StringBuilder-Objekt, um Zeichenfolgen in Schleifen anzuhängen:
Dim longString As New System.Text.StringBuilder For count As Integer = 1 To 1000 longString.Append(count) Next
Typableitung
Nutzen Sie den Typrückschluss für lokale Variablen:
Public Sub GetQuery()
Dim filterValue = "London"
Dim query = From customer In customers _
Where customer.Country = filterValue
End Sub
Weniger strenge Delegaten in Ereignishandlern
Verwenden Sie weniger strenge Delegaten und lassen Sie Ereignisargumente aus, wenn die Ereignisargumente im Code nicht verwendet werden:
Public Sub Form1_Load() Handles Form1.Load
End Sub
Datentyp ohne Vorzeichen
- Verwenden Sie eher Integer als Typen ohne Vorzeichen, es sei denn, der Arbeitsspeicher soll unbedingt geschont werden.
Arrays
Verwenden Sie die kurze Syntax, wenn Sie Arrays in der Deklarationszeile initialisieren:
Dim letters1() As String = {"a", "b", "c"}
Anstelle von:
Dim letters2() As String = New String() {"a", "b", "c"}
Legen Sie den Arraybezeichner in der Variablen, nicht im Typ ab:
Dim letters3() As String = {"a", "b", "c"}
Anstelle von:
Dim letters4 As String() = {"a", "b", "c"}
Verwenden Sie die { }-Syntax, wenn Sie Arrays aus grundlegenden Datentypen deklarieren und initialisieren:
Dim letters5() As String = {"a", "b", "c"}
Anstelle von:
Dim letters6(2) As String letters6(0) = "a" letters6(1) = "b" letters6(2) = "c"
Verwenden des with-Schlüsselworts
Bei einer Reihe von Aufrufen eines Objekts sollten Sie erwägen, das With-Schlüsselwort zu verwenden:
With orderLog
.Log = "Application"
.Source = "Application Name"
.MachineName = "Computer Name"
End With
Verwenden von Typrückschluss für Schleifenvariablen in For- oder For Each-Anweisungen
Anhand eines Typrückschlusses kann der Typ der Schleifenbereichsvariablen bestimmt werden.
Das folgende Beispiel veranschaulicht die Verwendung des Typrückschlusses in einer For-Anweisung:
For count = 0 To 2
MsgBox(names(count))
Next
Das folgende Beispiel veranschaulicht die Verwendung des Typrückschlusses in einer For Each-Anweisung:
For Each name In names
MsgBox(name)
Next
Verwenden von try-catch-Anweisungen zur Ausnahmebehandlung
Verwenden Sie nicht On Error Goto.
Verwenden Sie zum Behandeln von Ausnahmen eine Try...Catch-Anweisung:
Dim conn As New SqlConnection("connection string") Try Conn.Open() Catch ex As SqlException Finally Conn.Close() End Try
In der Using-Anweisung wurde eine Try...Catch-Anweisung mit einem Aufruf der Dispose-Methode kombiniert. Sie vereinfacht somit den Code. Wenn Sie eine Try...Catch-Anweisung verwenden und der einzige Code im Finally-Block ein Aufruf der Dispose-Methode ist, verwenden Sie stattdessen die Using-Anweisung.
Using redPen As New Pen(color.Red) ' Insert code here. End Using
Verwenden des IsNot-Schlüsselworts
Verwenden Sie bevorzugt das IsNot-Schlüsselwort anstelle von Not...Is Nothing.
Verwenden des AndAlso- und OrElse-Schlüsselworts
Verwenden Sie für Vergleiche AndAlso anstelle von And und OrElse anstelle von Or. Auf diese Weise werden Ausnahmebedingungen vermieden und die Leistung gesteigert, da nicht benötigter Code übersprungen wird.
' 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
Standardinstanzen von Formularen
Verwenden Sie eher Form1.ShowDialog als My.Forms.Form1.ShowDialog.
New-Schlüsselwort
Verwenden Sie die kurze Instanziierung:
Dim employees As New List(Of String)
Die vorangehende Zeile entspricht der Folgenden:
Dim employees2 As List(Of String) = New List(Of String)
Verwenden Sie für neue Objekte Objektinitialisierer anstelle des parameterlosen Konstruktors:
Dim orderLog As New EventLog With { _ .Log = "Application", _ .Source = "Application Name", _ .MachineName = "Computer Name"}
Ereignisbehandlung
Verwenden Sie eher Handles als AddHandler:
Private Sub ToolStripMenuItem1_Click() Handles ToolStripMenuItem1.Click End Sub
Verwenden Sie AddressOf, und instanziieren Sie den Delegaten nicht explizit:
Dim closeItem As New ToolStripMenuItem( _ "Close", Nothing, AddressOf ToolStripMenuItem1_Click) Me.MainMenuStrip.Items.Add(closeItem)
Wenn Sie ein Ereignis definieren, verwenden Sie die kurze Syntax, und lassen Sie den Delegaten vom Compiler definieren:
Public Event WhatHappened(ByVal source As Object, _ ByVal e As WhatHappenedEventArgs)
Sie müssen nicht überprüfen, ob ein Ereignis leer ist (Nothing (NULL)), bevor Sie die RaiseEvent-Methode aufrufen. Die RaiseEvent-Methode führt vor dem Auslösen des Ereignisses eine Überprüfung auf den Wert Nothing durch.
Verwenden von Shared-Membern
Rufen Sie Shared-Member über den Klassennamen auf, nicht von einer Instanzvariablen aus.
Verwenden der MsgBox-Funktion
Verwenden Sie MsgBox anstelle von MessageBox.Show oder Console.WriteLine. In Umgebungen, die die MsgBox-Funktion nicht unterstützen, z. B. Silverlight, müssen Sie eine entsprechende Alternative verwenden.
Verwenden des My-Namespaces
Ziehen Sie die Verwendung von My-Features gegenüber der .NET Framework-Klassenbibliothek oder der Visual Basic-Laufzeitbibliothek vor. Weitere Informationen hierzu finden Sie unter Objekte (Visual Basic).
Verwenden von XML-Literalen
XML-Literale vereinfachen allgemeine Aufgaben bei der Arbeit mit XML (z. B. Laden, Abfragen und Umwandeln). Beachten Sie bei der Entwicklung mit XML die folgenden Richtlinien:
Verwenden Sie zum Erstellen von XML-Dokumenten und –Fragmenten XML-Literale, anstatt die XML-APIs direkt aufzurufen.
Importieren Sie XML-Namespaces auf Datei- oder Projektebene, um die Leistungsoptimierung für XML-Literale zu verwenden.
Verwenden Sie die XML-Achseneigenschaften, um auf Elemente und Attribute in einem XML-Dokument zuzugreifen.
Verwenden Sie eingebettete Ausdrücke, um Werte einzuschließen und XML aus vorhandenen Werten zu erstellen, anstatt API-Aufrufe wie die Add-Methode zu nutzen:
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-Abfragen
Verwenden Sie aussagekräftige Namen für Abfragevariablen:
Dim seattleCustomers = From cust In customers _ Where cust.City = "Seattle"
Weisen Sie den Elementen in einer Abfrage Aliasnamen zu, um eine korrekte Großschreibung von Eigenschaftennamen anonymer Typen in Pascal-Schreibweise sicherzustellen:
Dim customerOrders = From customer In customers _ Join order In orders _ On customer.CustomerID Equals order.CustomerID _ Select Customer = customer, Order = order
Benennen Sie Eigenschaften um, wenn die Eigenschaftennamen im Ergebnis nicht eindeutig sind. Wenn die Abfrage beispielsweise einen Kundennamen und eine Auftrags-ID zurückgibt, sollten Sie diese im Ergebnis umbenennen, anstatt Name und ID zu übernehmen:
Dim customerOrders2 = From cust In customers _ Join ord In orders _ On cust.CustomerID Equals ord.CustomerID _ Select CustomerName = cust.Name, _ OrderID = ord.ID
Verwenden Sie den Typrückschluss in der Deklaration von Abfragevariablen und Bereichsvariablen:
Dim customerList = From cust In customers
Richten Sie Abfrageklauseln unter der From-Anweisung aus:
Dim newyorkCustomers = From cust In customers _ Where cust.City = "New York" _ Select cust.LastName, cust.CompanyName
Verwenden Sie vor anderen Abfrageklauseln Where-Klauseln, sodass die nachfolgenden Abfrageklauseln für den reduzierten, gefilterten Datensatz ausgeführt werden:
Dim newyorkCustomers2 = From cust In customers _ Where cust.City = "New York" _ Select cust.LastName, cust.CompanyName
Verwenden Sie zum expliziten Definieren einer Verbindung die Join-Klausel anstelle der Where-Klausel, bei der Verbindungen nur implizit definiert werden:
Dim customerList2 = From cust In customers _ Join order In orders _ On cust.CustomerID Equals order.CustomerID _ Select cust, order
Verwenden der Member der Visual Basic-Laufzeitbibliothek
Ziehen Sie die Verwendung der Visual Basic-Laufzeitbibliothek gegenüber der .NET Framework-Klassenbibliothek vor.
Richtlinien für Beispiele
Allgemein
Beachten Sie die Entwurfsrichtlinien in den Design Guidelines for Class Library Developers.
Geben Sie die Eingabeaufforderung und den Titel von MsgBox-Aufrufen an.
Verwenden Sie gegebenenfalls Ressourcendateien.
Verwenden Sie Option Strict On entweder in jeder Datei oder als Projekteinstellung.
Aktivieren Sie beim Kompilieren alle Warnungen.
Definieren Sie Class, Structure oder Interface in einer Datei nur einmal.
Verwenden Sie beim Speichern von Dateien die Standardcodierung.
Lokalisierung
Verwenden Sie die AutoSize-Eigenschaft, wo dies möglich ist.
Achten Sie darauf, dass Steuerelemente nicht verdeckt werden oder sich überlappen.
Reihen Sie Steuerelemente nicht, um damit einen Satz zu erstellen.
Erstellen Sie keine Zeichenfolgen, indem Sie Zeichen aus einer anderen Zeichenfolge entfernen.
Verwenden Sie kulturneutrale Grafiken.
Verwenden Sie nur die Schriftarten Tahoma oder MS Sans Serif.
Eingabehilfen
Verwenden Sie die Farben auf der Registerkarte System des Farbauswahldialogfelds.
Verwenden Sie Zugriffstasten für alle Menüs, Bezeichnungen, Schaltflächen usw.
Legen Sie Steuerelementeigenschaften wie in der folgenden Tabelle beschrieben fest.
Eigenschaft |
Einstellung |
---|---|
AccessibleDescription |
Eine Beschreibung des Steuerelements. |
AccessibleName |
Ein Name für das Steuerelement. |
AccessibleRole |
Verwenden Sie die Standardeinstellung, oder setzen Sie diese Eigenschaft zurück, wenn ein Steuerelement eine andere Rolle hat. |
TabIndex |
Legen Sie hierfür eine logische Reihenfolge fest. |
Text |
Allen durch Klicken aktivierbaren Steuerelementen sollte eine Tastaturzugriffstaste (Tastenkombination) zugewiesen sein. |
Schriftgrad |
Verwenden Sie die Standardeinstellung, oder legen Sie einen Schriftgrad von 10 Punkt oder mehr fest. |
ForeColor |
Standardeinstellung |
BackColor |
Standardeinstellung |
BackgroundImage |
Standardeinstellung |
Sicherheit
Befolgen Sie die Richtlinien in Richtlinien für das Schreiben von sicherem Code.
Siehe auch
Weitere Ressourcen
Entwurfsrichtlinien zum Entwickeln von Klassenbibliotheken
Richtlinien für das Schreiben von sicherem Code
Änderungsprotokoll
Datum |
Versionsgeschichte |
Grund |
---|---|---|
Juli 2008 |
Richtlinien mit neuen Sprachfeatures, darunter LINQ, XML-Literale, Objektinitialisierer, Typrückschluss und weniger strenge Delegaten aktualisiert. |
Korrektur inhaltlicher Fehler. |