Compartir a través de


Convenciones de código de Visual Basic

Microsoft utiliza estas directrices para desarrollar ejemplos y documentación. La especificación del lenguaje de Visual Basic no define una codificación estándar.

  • Las convenciones de codificación dan un aspecto coherente al código, de modo que los lectores pueden centrar su atención en el contenido y no en el diseño.

  • Las convenciones permiten que los lectores comprendan el código con más rapidez porque les permite hacer suposiciones basadas en su experiencia anterior.

  • Las convenciones facilitan la copia, la modificación y el mantenimiento del código.

  • Las convenciones muestran los "procedimientos recomendados" de Visual Basic.

Explicación

Convenciones de nomenclatura

  • Las directrices de nomenclatura se tratan en Instrucciones de diseño para desarrollar bibliotecas de clases.

  • No tiene que cambiar el nombre de los objetos que se hayan creado con las herramientas de diseño de Visual Studio para que se ajusten a estas directrices.

  • Utilice las calificaciones de espacios de nombres en lugar de agregar instrucciones Imports. Si un espacio de nombres se importa de manera predeterminada en un proyecto, no tiene que utilizar nombres completos en el código porque se ejecutará sin calificar con IntelliSense cuando se copie y se pegue. Al dividir líneas largas de código para facilitar la lectura del código, los nombres completos pueden cortarse después del "." Por ejemplo:

    Dim collection As System.Diagnostics. 
           InstanceDataCollectionCollection
    
  • No utilice "Mi" o "mi" como parte de un nombre de variable. Esto crea confusión con los objetos My.

Convenciones de diseño

Un diseño apropiado utiliza formatos para hacer hincapié en la estructura del código y facilitar su lectura.

  • Utilice la característica de lista descriptiva para dar formato al código con la configuración predeterminada (sangría automática, sangrías de 4 caracteres, guardar tabuladores como espacios). Para obtener más información, vea Opciones específicas de VB, Basic, Editor de texto, Opciones (Cuadro de diálogo).

  • Utilice sólo una instrucción por línea. No utilice el carácter (:) de continuación de línea de Visual Basic.

  • Utilice sólo una declaración por línea.

  • Si la lista descriptiva no da formato a las líneas de continuación, aplique una sangría de una posición de tabulación a las líneas de continuación.

  • Agregue al menos una línea en blanco entre el método y las definiciones de propiedad.

Convenciones de los comentarios

  • No utilice comentarios al final de una línea de código. Sitúe los comentarios en una línea independiente.

  • Comience el texto del comentario con una letra mayúscula.

  • Finalice el comentario con un punto.

  • Inserte un espacio entre el delimitador de comentario (') y el texto del comentario.

    ' Here is a comment.
    
  • No cree bloques de asteriscos con formato alrededor de los comentarios.

Estructura del programa

  • Al utilizar el método Main, utilice la construcción predeterminada para las nuevas aplicaciones de consola y utilice My para los argumentos de la línea de comandos.

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

Convenciones de lenguaje

String (Tipo de datos)

  • Utilice & para concatenar cadenas:

    MsgBox("hello" & vbCrLf & "goodbye")
    
  • Para anexar cadenas en bucles, utilice el objeto StringBuilder:

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

Inferencia de tipo

Saque partido de la inferencia de tipos para las variables locales:

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

Delegados flexibles en controladores de eventos

Utilice delegados flexibles y omita argumentos de evento si no está utilizando argumentos de evento en el código:

Public Sub Form1_Load() Handles Form1.Load
End Sub

Tipo de datos sin signo

  • Utilice Integer en lugar de tipos sin signo a menos que la memoria sea insuficiente.

Matrices

  • Utilice la sintaxis abreviada al inicializar las matrices en la línea de declaración:

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

    en lugar de:

    Dim letters2() As String = New String() {"a", "b", "c"}
    
  • Sitúe el designador de la matriz en la variable, no en el tipo:

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

    en lugar de:

    Dim letters4 As String() = {"a", "b", "c"}
    
  • Utilice la sintaxis {} al declarar e inicializar matrices de tipos de datos básicos:

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

    en lugar de:

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

Utilice la palabra clave With

Cuando utilice una serie de llamadas a un objeto, considere la posibilidad de utilizar la palabra clave With.

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

Utilizar la inferencia de tipos para variables de bucle en instrucciones For o For Each

Permita que la inferencia de tipos determine el tipo de variable de intervalo de bucle.

A continuación hay un ejemplo de cómo se utiliza la inferencia de tipos en una instrucción For:

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

A continuación hay un ejemplo de cómo se utiliza la inferencia de tipos en una instrucción For Each:

For Each name In names
  MsgBox(name)
Next

Utilizar las instrucciones Try...Catch y Using para el control de excepciones

  • No utilice On Error Goto.

  • Para controlar las excepciones, utilice una instrucción Try...Catch:

    Dim conn As New SqlConnection("connection string")
    Try
      Conn.Open()
    Catch ex As SqlException
    
    Finally
      Conn.Close()
    End Try
    
  • La instrucción Using combina una instrucción Try...Catch con una llamada al método Dispose y simplifica el código. Si está utilizando una instrucción Try...Catch y el único código en el bloque Finally es una llamada al método Dispose, utilice la instrucción Using en su lugar.

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

Utilizar la palabra clave IsNot

Utilice preferentemente la palabra clave IsNot a Not...Is Nothing.

Utilizar las palabras clave AndAlso y OrElse

Para evitar excepciones y aumentar el rendimiento omitiendo el código innecesario, utilice AndAlso en lugar de And y OrElse en lugar de Or al realizar las comparaciones:

' 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

Instancias de formularios predeterminadas

Utilice Form1.ShowDialog en lugar de My.Forms.Form1.ShowDialog.

New (Palabra clave)

  • Utilice la creación de instancias abreviadas:

    Dim employees As New List(Of String)
    

    La línea anterior es equivalente a esto:

    Dim employees2 As List(Of String) = New List(Of String)
    
  • Utilice los inicializadores de objeto para los nuevos objetos en lugar del constructor sin parámetros:

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

Control de eventos

  • Utilice Handles en lugar de AddHandler.

    Private Sub ToolStripMenuItem1_Click() Handles ToolStripMenuItem1.Click
    End Sub
    
  • Utilice AddressOf y no cree instancias explícitas del delegado:

    Dim closeItem As New ToolStripMenuItem( 
        "Close", Nothing, AddressOf ToolStripMenuItem1_Click)
    Me.MainMenuStrip.Items.Add(closeItem)
    
  • Cuando defina un evento, utilice la sintaxis corta y permita que el compilador defina el delegado:

    Public Event WhatHappened(ByVal source As Object, 
                              ByVal e As WhatHappenedEventArgs)
    
  • No compruebe si un evento es Nothing (null) antes de llamar al método RaiseEvent. RaiseEvent comprueba Nothing antes de generar el evento.

Utilizar miembros compartidos

Llame a los miembros Shared utilizando el nombre de clase y no una variable de instancia.

Utilizar la función MsgBox

Utilice MsgBox en lugar de MessageBox.Show o Console.WriteLine. En entornos que no admiten la función MsgBox, como Silverlight, utilice una alternativa adecuada.

Utilice el espacio de nombres My

Utilice las características My en preferencia a la biblioteca de clases de .NET Framework o a la biblioteca en tiempo de ejecución de Visual Basic. Para obtener más información, vea Objetos (Visual Basic).

Utilizar literales XML

Los literales XML simplifican las tareas más comunes con las que se encuentra al trabajar con XML (por ejemplo, cargar, consultar y transformar). Al desarrollar con XML, siga estas instrucciones:

  • Utilice literales XML para crear documentos y fragmentos XML en lugar de llamar directamente a API XML.

  • Importe espacios de nombres XML al archivo o nivel de proyecto para sacar partido de la optimización del rendimiento para los literales XML.

  • Utilice las propiedades de eje XML para tener acceso a elementos y atributos en un documento XML.

  • Utilice expresiones incrustadas para incluir valores y crear XML a partir de valores existentes en lugar de utilizar llamadas de API como el método 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
    

Consultas LINQ

  • Utilice nombres descriptivos para las variables de consulta:

    Dim seattleCustomers = From cust In customers 
                           Where cust.City = "Seattle"
    
  • Cree alias de elementos en una consulta para asegurarse de que los nombres de propiedad de tipos anónimos se escriben con las mayúsculas correctas mediante la grafía Pascal:

    Dim customerOrders = From customer In customers 
                         Join order In orders 
                           On customer.CustomerID Equals order.CustomerID 
                         Select Customer = customer, Order = order
    
  • Cambie el nombre de las propiedades cuando los nombres de propiedad en el resultado puedan ser ambiguos. Por ejemplo, si la consulta devuelve un nombre de cliente y un Id. de pedido, en lugar de dejarlos como Name e ID en el resultado, cámbieles el nombre:

    Dim customerOrders2 = From cust In customers 
                          Join ord In orders
                            On cust.CustomerID Equals ord.CustomerID 
                          Select CustomerName = cust.Name, 
                                 OrderID = ord.ID
    
  • Utilice la inferencia de tipos en la declaración de variables de consulta y variables de intervalo:

    Dim customerList = From cust In customers
    
  • Alinee las cláusulas de consulta bajo la instrucción From:

    Dim newyorkCustomers = From cust In customers 
                           Where cust.City = "New York" 
                           Select cust.LastName, cust.CompanyName
    
  • Utilice las cláusulas Where antes de otras cláusulas de consulta para asegurarse de que las cláusulas de consulta posteriores operen en el conjunto de datos reducido y filtrado:

    Dim newyorkCustomers2 = From cust In customers 
                            Where cust.City = "New York" 
                            Order By cust.LastName
    
  • Utilice la cláusula Join para definir explícitamente una combinación en lugar de utilizar la cláusula Where para definir implícitamente una combinación:

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

Utilice los miembros de la biblioteca en tiempo de ejecución de Visual Basic

Utilice la biblioteca en tiempo de ejecución de Visual Basic en preferencia a la biblioteca de clases de .NET Framework.

Vea también

Conceptos

Instrucciones de codificación segura

Otros recursos

Instrucciones de diseño para desarrollar bibliotecas de clases