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. |