Convenciones de código de Visual Basic

Actualización: Julio de 2008

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 provocar 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" _
                            Select cust.LastName, cust.CompanyName
    
  • 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.

Directrices para los ejemplos

General

  • Siga las instrucciones de diseño en Instrucciones de diseño para programadores de bibliotecas de clases.

  • Especifique el indicador y el título de las llamadas a MsgBox.

  • Utilice los archivos de recursos cuando sea apropiado.

  • Utilice Option Strict On en cada archivo o como una configuración del proyecto.

  • Realice la compilación con todas las advertencias activadas.

  • Defina sólo una Class, Structure o Interface en un archivo.

  • Utilice la codificación predeterminada para guardar los archivos.

Localización

  • Utilice la propiedad AutoSize donde sea posible.

  • No oculte ni superponga los controles.

  • No alinee los controles para crear una instrucción.

  • No genere cadenas extrayendo caracteres de otra cadena.

  • Utilice gráficos neutros respecto a la referencia cultural.

  • Utilice sólo las fuentes Tahoma o MS Sans Serif.

Accesibilidad

  • Utilice colores en la ficha Sistema del cuadro de diálogo de selección de color.

  • Utilice aceleradores en todos los menús, etiquetas, botones, etc.

  • Establezca las propiedades de control tal y como se describen en la tabla siguiente.

Propiedad

Ajuste

AccessibleDescription

Descripción del control.

AccessibleName

Nombre del control.

AccessibleRole

Utilice el valor predeterminado o vuelva a definir esta propiedad si un control tiene otra función.

TabIndex

Utilice un orden lógico.

Text

Todos los controles seleccionables deberían tener una tecla de acceso del teclado (método abreviado).

Font size

Utilice el valor predeterminado o establezca la fuente en 10 puntos o más

Forecolor

Default

Backcolor

Default

BackgroundImage

Default

Seguridad

Siga las directrices incluidas en Instrucciones de codificación segura.

Vea también

Otros recursos

Instrucciones de diseño para desarrollar bibliotecas de clases

Instrucciones de codificación segura

Historial de cambios

Fecha

Historial

Motivo

Julio de 2008

Instrucciones actualizadas con nuevas características de lenguaje, incluidos LINQ, literales XML, inicializadores de objeto, inferencia de tipos y delegados flexibles.

Corrección de errores de contenido.