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.