Codierungskonventionen in Visual Basic

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" 
                            Order By cust.LastName
    
  • 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.

Siehe auch

Konzepte

Richtlinien für das Schreiben von sicherem Code

Weitere Ressourcen

Entwurfsrichtlinien zum Entwickeln von Klassenbibliotheken