Convenzioni di codifica di Visual Basic

Queste istruzioni vengono utilizzate da Microsoft per sviluppare gli esempi e la documentazione. La specifica di linguaggio Visual Basic non definisce uno standard di codifica.

  • Le convenzioni di codifica conferiscono al codice un aspetto coerente, in modo che chi legge possa concentrarsi sul contenuto e non sul layout.

  • Le convenzioni consentono a chi legge di comprendere il codice più rapidamente, in quanto ha la possibilità di formulare ipotesi basate sulle esperienze precedenti.

  • Le convenzioni semplificano la copia, la modifica e la gestione del codice.

  • Le convenzioni illustrano i "suggerimenti" di Visual Basic.

Descrizione

Convenzioni di denominazione

  • Le indicazioni per la denominazione sono illustrate in Linee guida di progettazione per lo sviluppo di librerie di classi.

  • Non è necessario modificare il nome degli oggetti creati dagli strumenti di progettazione di Visual Studio per adattarli alle istruzioni.

  • Utilizzare le qualificazioni degli spazi dei nomi invece di aggiungere istruzioni Imports. Se uno spazio dei nomi viene importato in un progetto per impostazione predefinita, non è necessario specificare il nome completo del codice perché questo verrà eseguito come non qualificato con IntelliSense quando verrà copiato e incollato. Quando si interrompono lunghe righe di codice per agevolarne la lettura, è possibile interrompere i nomi completi dopo il "." Di seguito è riportato un esempio:

    Dim collection As System.Diagnostics. 
           InstanceDataCollectionCollection
    
  • Non utilizzare "My" o "my" come parte di un nome di variabile, in quanto crea confusione con gli oggetti My.

Convenzioni di layout

Il layout appropriato utilizza la formattazione per mettere in evidenza la struttura del codice e agevolarne la lettura.

  • Utilizzare la funzionalità di riformattazione del listato per formattare il codice con le impostazioni predefinite (rientri intelligenti, rientri di 4 caratteri, tabulazioni salvate come spazi). Per ulteriori informazioni, vedere Specifiche di VB, Di base, Editor di testo, finestra di dialogo Opzioni.

  • Utilizzare una sola istruzione per riga. Non utilizzare il carattere di continuazione di riga di Visual Basic (:).

  • Utilizzare una sola dichiarazione per riga.

  • Se nella riformattazione del listato non viene eseguita la formattazione di righe di continuazione, impostare il rientro delle righe di continuazione di un punto di tabulazione.

  • Aggiungere almeno una riga vuota tra le definizioni di metodi e di proprietà.

Convenzioni relative ai commenti

  • Non utilizzare commenti alla fine di una riga di codice. Inserire i commenti in una riga separata.

  • Iniziare il testo del commento con una lettera maiuscola.

  • Terminare il commento con un punto.

  • Inserire uno spazio tra il delimitatore di commento (') e il testo del commento.

    ' Here is a comment.
    
  • Non creare blocchi formattati di asterischi che racchiudono il commento.

Struttura del programma

  • Quando si utilizza il metodo Main, utilizzare il costrutto predefinito per le nuove applicazioni console e utilizzare My per gli argomenti della riga di comando.

    Sub Main()
      For Each argument As String In My.Application.CommandLineArgs
        ' Add code here to use the string variable.
      Next
    End Sub
    

Istruzioni relative al linguaggio

Tipo di dati String

  • Utilizzare & per concatenare le stringhe:

    MsgBox("hello" & vbCrLf & "goodbye")
    
  • Per accodare stringhe nei cicli, utilizzare l'oggetto StringBuilder:

    Dim longString As New System.Text.StringBuilder
    For count As Integer = 1 To 1000
      longString.Append(count)
    Next
    

Inferenza di tipi

Utilizzare l'inferenza dei tipi per le variabili locali:

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

Delegati di tipo relaxed nei gestori eventi

Se non si utilizzano argomenti degli eventi nel codice, utilizzare i delegati di tipo relaxed ed escludere gli argomenti degli eventi:

Public Sub Form1_Load() Handles Form1.Load
End Sub

Tipi di dati senza segno

  • Utilizzare Integer invece dei tipi senza segno a meno che non si disponga di poca memoria.

Matrici

  • Utilizzare la sintassi breve quando si inizializzano le matrici nella riga della dichiarazione:

    Dim letters1() As String = {"a", "b", "c"}
    

    Invece di:

    Dim letters2() As String = New String() {"a", "b", "c"}
    
  • Inserire l'identificatore di matrici nella variabile e non nel tipo:

    Dim letters3() As String = {"a", "b", "c"}
    

    Invece di:

    Dim letters4 As String() = {"a", "b", "c"}
    
  • Utilizzare la sintassi { } quando si dichiarano e si inizializzano le matrici dei tipi di dati di base:

    Dim letters5() As String = {"a", "b", "c"}
    

    Invece di:

    Dim letters6(2) As String
    letters6(0) = "a"
    letters6(1) = "b"
    letters6(2) = "c"
    

Utilizzare la parola chiave With

Per la gestione di una serie di chiamate a un oggetto, è consigliabile utilizzare la parola chiave With.

With orderLog
  .Log = "Application"
  .Source = "Application Name"
  .MachineName = "Computer Name"
End With

Utilizzo dell'inferenza dei tipi per le variabili di ciclo nelle istruzioni For o For Each

È possibile utilizzare l'inferenza dei tipi per determinare il tipo della variabile di intervallo di ciclo.

Nell'esempio riportato di seguito viene illustrato l'utilizzo dell'inferenza dei tipi in un'istruzione For:

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

Nell'esempio riportato di seguito viene illustrato l'utilizzo dell'inferenza dei tipi in un'istruzione For Each:

For Each name In names
  MsgBox(name)
Next

Utilizzo delle istruzioni Try...Catch e Using per la gestione delle eccezioni

  • Non utilizzare la proprietà On Error Goto.

  • Per gestire le eccezioni, utilizzare un'istruzione Try...Catch:

    Dim conn As New SqlConnection("connection string")
    Try
      Conn.Open()
    Catch ex As SqlException
    
    Finally
      Conn.Close()
    End Try
    
  • L'istruzione Using combina un'istruzione Try...Catch con una chiamata al metodo Dispose e consente di semplificare il codice. Se si utilizza un'istruzione Try...Catch e il solo codice nel blocco Finally è costituito da una chiamata al metodo Dispose, utilizzare invece l'istruzione Using.

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

Utilizzo della parola chiave IsNot

Preferire la parola chiave IsNot a Not...Is Nothing.

Utilizzo delle parole chiave AndAlso e OrElse

Per evitare che vengano generate eccezioni e migliorare le prestazioni ignorando il codice non necessario, nell'esecuzione di confronti utilizzare AndAlso anziché And e OrElse anziché 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

Istanze predefinite dei form

Utilizzare Form1.ShowDialog invece di My.Forms.Form1.ShowDialog.

Parola chiave New

  • Utilizzare la creazione di istanze breve:

    Dim employees As New List(Of String)
    

    La riga precedente è equivalente a:

    Dim employees2 As List(Of String) = New List(Of String)
    
  • Per i nuovi oggetti, utilizzare inizializzatori di oggetti anziché il costruttore senza parametri:

    Dim orderLog As New EventLog With { 
        .Log = "Application", 
        .Source = "Application Name", 
        .MachineName = "Computer Name"}
    

Gestione di eventi

  • Utilizzare Handles invece di AddHandler:

    Private Sub ToolStripMenuItem1_Click() Handles ToolStripMenuItem1.Click
    End Sub
    
  • Utilizzare AddressOf e non creare l'istanza del delegato in modo esplicito:

    Dim closeItem As New ToolStripMenuItem( 
        "Close", Nothing, AddressOf ToolStripMenuItem1_Click)
    Me.MainMenuStrip.Items.Add(closeItem)
    
  • Quando si definisce un evento, utilizzare la sintassi breve e lasciare che il delegato venga definito dal compilatore:

    Public Event WhatHappened(ByVal source As Object, 
                              ByVal e As WhatHappenedEventArgs)
    
  • Non è necessario verificare se un evento è Nothing (null) prima di effettuare la chiamata a RaiseEvent. Il metodo RaiseEvent esegue una ricerca per Nothing prima di generare l'evento.

Utilizzo di membri condivisi

Per la chiamata a membri Shared, utilizzare il nome della classe anziché una variabile di istanza.

Utilizzo della funzione MsgBox

Utilizzare MsgBox invece di MessageBox.Show o di Console.WriteLine. In ambienti che non supportano la funzione MsgBox, ad esempio Silverlight, utilizzare un'alternativa appropriata.

Utilizzare lo spazio dei nomi My

Preferire le funzionalità di My alla libreria di classi di .NET Framework e alla libreria di runtime di Visual Basic. Per ulteriori informazioni, vedere la classe Oggetti (Visual Basic).

Utilizzo di valori letterali XML

I valori letterali XML semplificano le attività più comuni nell'utilizzo di XML (caricamento, query, trasformazione e così via). Quando si utilizza XML a fini di sviluppo, attenersi alle seguenti linee guida:

  • Utilizzare i valori letterali XML per creare documenti e frammenti XML anziché chiamare direttamente API XML.

  • Importare spazi dei nomi XML a livello di file o di progetto per sfruttare le ottimizzazioni delle prestazioni per i valori letterali XML.

  • Utilizzare le proprietà axis XML per accedere a elementi e attributi in un documento XML.

  • Utilizzare le espressioni incorporate per includere valori e creare XML da valori esistenti anziché utilizzare le chiamate API, ad esempio il metodo 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
    

Query LINQ

  • Utilizzare nomi significativi per le variabili di query:

    Dim seattleCustomers = From cust In customers 
                           Where cust.City = "Seattle"
    
  • Utilizzare alias per gli elementi delle query, in modo che i nomi di proprietà dei tipi anonimi vengano convertiti in maiuscole in modo corretto utilizzando la convenzione Pascal:

    Dim customerOrders = From customer In customers 
                         Join order In orders 
                           On customer.CustomerID Equals order.CustomerID 
                         Select Customer = customer, Order = order
    
  • Rinominare le proprietà quando i nomi potrebbero risultare ambigui nel risultato. Ad esempio, se la query restituisce il nome di un cliente e l'ID di un ordine, anziché lasciarli come Name e ID nei risultati, rinominarli come indicato di seguito:

    Dim customerOrders2 = From cust In customers 
                          Join ord In orders
                            On cust.CustomerID Equals ord.CustomerID 
                          Select CustomerName = cust.Name, 
                                 OrderID = ord.ID
    
  • Utilizzare l'inferenza dei tipi nella dichiarazione di variabili di query e variabili di intervallo:

    Dim customerList = From cust In customers
    
  • Allineare le clausole di query sotto l'istruzione From:

    Dim newyorkCustomers = From cust In customers 
                           Where cust.City = "New York" 
                           Select cust.LastName, cust.CompanyName
    
  • Utilizzare le clausole Where prima di altre clausole di query per fare in modo che le ultime clausole di query agiscano su un insieme di dati ridotto e filtrato:

    Dim newyorkCustomers2 = From cust In customers 
                            Where cust.City = "New York" 
                            Order By cust.LastName
    
  • Utilizzare la clausola Join per definire un join in modo esplicito anziché utilizzare la clausola Where per definirlo in modo implicito:

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

Utilizzare i membri delle librerie di runtime di Visual Basic

Preferire la libreria di runtime di Visual Basic alla libreria di classi di .NET Framework.

Vedere anche

Concetti

Linee guida per la generazione di codice sicuro

Altre risorse

Linee guida di progettazione per lo sviluppo di librerie di classi