Referencias a elementos declarados (Visual Basic)

Si el código hace referencia a un elemento declarado, el compilador de Visual Basic busca la coincidencia del nombre de la referencia con la declaración pertinente del nombre. Si se han declarado varios elementos con el mismo nombre, es posible controlar a cuál de ellos se hace referencia mediante la calificación de su nombre.

El compilador intenta buscar la coincidencia entre una referencia del nombre y una declaración del nombre con el ámbito más limitado. Esto significa que comienza con el código que realiza la referencia y se mueve hacia afuera a través de los sucesivos niveles de elementos contenedores.

El ejemplo siguiente muestra las referencias a dos variables con el mismo nombre. En el ejemplo se declaran dos variables, cada una denominada totalCount, en los diferentes niveles de ámbito del módulo container. Cuando el procedimiento showCount muestra totalCount sin la calificación, el compilador de Visual Basic resuelve la referencia a la declaración con el ámbito más restringido, concretamente la declaración local dentro de showCount. Cuando califica totalCount con el módulo contenedor container, el compilador resuelve la referencia en la declaración con el ámbito más ancho.

' Assume these two modules are both in the same assembly.
Module container
    Public totalCount As Integer = 1
    Public Sub showCount()
        Dim totalCount As Integer = 6000
        ' The following statement displays the local totalCount (6000).
        MsgBox("Unqualified totalCount is " & CStr(totalCount))
        ' The following statement displays the module's totalCount (1).
        MsgBox("container.totalCount is " & CStr(container.totalCount))
    End Sub
End Module
Module callingModule
    Public Sub displayCount()
        container.showCount()
        ' The following statement displays the containing module's totalCount (1).
        MsgBox("container.totalCount is " & CStr(container.totalCount))
    End Sub
End Module

Calificar un nombre de elemento

Si quiere omitir este proceso de búsqueda y especificar un nombre declarado en un ámbito más ancho, debe calificar el nombre con el elemento contenedor del ámbito más ancho. En algunos casos, podría tener que calificar también el elemento contenedor.

Calificar un nombre significa que hay que hacerlo preceder en la instrucción de origen con información que identifique dónde se ha definido el elemento de destino. Esta información se denomina cadena de la calificación. Puede incluir uno o más espacios de nombres y un módulo, clase o estructura.

La cadena de la calificación debe especificar de forma inequívoca el módulo, clase o estructura que contiene el elemento de destino. Se puede buscar a su vez el contenedor en otro elemento contenedor, normalmente un espacio de nombres. Es posible que necesite incluir varios elementos contenedores en la cadena de la calificación.

Para tener acceso a un elemento declarado mediante la calificación de su nombre

  1. Determine la ubicación en la que se ha definido el elemento. Esto puede incluir un espacio de nombres o incluso una jerarquía de espacios de nombres. Dentro del espacio de nombres de nivel inferior, el elemento debe estar contenido en un módulo, clase o estructura.

    ' Assume the following hierarchy exists outside your code.
    Namespace outerSpace
        Namespace innerSpace
            Module holdsTotals
                Public Structure totals
                    Public thisTotal As Integer
                    Public Shared grandTotal As Long
                End Structure
            End Module
        End Namespace
    End Namespace
  2. Determine una ruta de acceso de calificación basada en la ubicación del elemento de destino. Comience con el espacio de nombres de nivel superior, continúe con el espacio de nombres de nivel inferior y termine con el módulo, clase o estructura que contiene el elemento de destino. Cada elemento en la ruta de acceso debe contener el elemento que le sigue.

    outerSpace → innerSpace → holdsTotals → totals

  3. Prepare la cadena de la calificación para el elemento de destino. Coloque un punto (.) después de cada elemento en la ruta de acceso. Su aplicación debe tener acceso a cada elemento en la cadena de la calificación.

    outerSpace.innerSpace.holdsTotals.totals.
  4. Escriba la expresión o instrucción de asignación que hace referencia al elemento de destino de la manera normal.

    grandTotal = 9000
  5. Preceda el nombre del elemento de destino con la cadena de la calificación. El nombre debe ir inmediatamente después del punto (.) que sigue al módulo, clase o estructura que contiene el elemento.

    ' Assume the following module is part of your code.
    Module accessGrandTotal
        Public Sub setGrandTotal()
            outerSpace.innerSpace.holdsTotals.totals.grandTotal = 9000
        End Sub
    End Module
  6. El compilador utiliza la cadena de la calificación para encontrar una declaración clara e inequívoca con la que puede hacer coincidir la referencia del elemento de destino.

También podría tener que calificar una referencia de nombre si la aplicación tiene acceso a más de un elemento de programación con el mismo nombre. Por ejemplo, los espacios de nombres System.Windows.Forms y System.Web.UI.WebControls contienen los dos una clase Label (System.Windows.Forms.Label y System.Web.UI.WebControls.Label). Si una aplicación utiliza los dos o si define su propia clase Label, debe distinguir los objetos Label diferentes. Incluya el espacio de nombres o un alias de importación en la declaración de variable. El ejemplo siguiente utiliza el alias de importación.

' The following statement must precede all your declarations.
Imports win = System.Windows.Forms, web = System.Web.UI.WebControls
' The following statement references the Windows.Forms.Label class.
Dim winLabel As New win.Label()

Miembros de otros elementos contenedores

Si se utiliza un miembro no compartido de otra clase o estructura, primero debe calificarse el nombre del miembro con una variable o una expresión que se refiera a una instancia de la clase o de la estructura. En el ejemplo siguiente, demoClass es una instancia de una clase denominada class1.

Dim demoClass As class1 = New class1()
demoClass.someSub[(argumentlist)]

No puede utilizarse el propio nombre de la clase para calificar a un miembro que no es Shared (Visual Basic). Debe crear primero una instancia en una variable de objeto (en este caso demoClass) y, a continuación, hacer referencia a ella por el nombre de variable.

Si una clase o estructura tiene un miembro Shared, puede calificar ese miembro con el nombre de clase o estructura, o con una variable o expresión que señale a una instancia.

Un módulo no tiene ninguna instancia separada y todos sus miembros son de manera predeterminada Shared. Por consiguiente, califica un miembro de módulo con el nombre del módulo.

El ejemplo siguiente muestra referencias calificadas a procedimientos de miembros de módulos. En el ejemplo se declaran dos procedimientos Sub, ambos denominados perform, en módulos diferentes de un proyecto. Los dos pueden especificarse sin calificación en su propio módulo, pero deben ser calificados si se les hace referencia desde otra sección. Como la referencia final en module3 no califica perform, el compilador no puede resolver esa referencia.

' Assume these three modules are all in the same assembly.
Module module1
    Public Sub perform()
        MsgBox("module1.perform() now returning")
    End Sub
End Module
Module module2
    Public Sub perform()
        MsgBox("module2.perform() now returning")
    End Sub
    Public Sub doSomething()
        ' The following statement calls perform in module2, the active module.
        perform()
        ' The following statement calls perform in module1.
        module1.perform()
    End Sub
End Module
Module module3
    Public Sub callPerform()
        ' The following statement calls perform in module1.
        module1.perform()
        ' The following statement makes an unresolvable name reference
        ' and therefore generates a COMPILER ERROR.
        perform() ' INVALID statement
    End Sub
End Module

Referencia a proyectos

Para poder utilizar elementos Public (Visual Basic) definidos en otro proyecto, primero debe definirse una referencia al ensamblado o a la biblioteca de tipos del proyecto. Para establecer una referencia, haga clic en Agregar referencia en el menú Proyecto o utilice la opción del compilador de línea de comandos /reference (Visual Basic).

Por ejemplo, puede utilizar el modelo de objetos XML de .NET Framework. Si establece una referencia en el espacio de nombres System.Xml, puede declarar y utilizar cualquiera de sus clases, como XmlDocument. El ejemplo siguiente utiliza XmlDocument.

' Assume this project has a reference to System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As System.Xml.XmlDocument

Importar elementos contenedores

Puede utilizar Instrucción Imports (Tipo y espacio de nombres de .NET) para importar los espacios de nombres que contienen los módulos o clases que desea utilizar. Esto permite hacer referencia a los elementos definidos en un espacio de nombres importado sin calificar por completo sus nombres. En el ejemplo siguiente se escribe de nuevo el ejemplo anterior para importar el espacio de nombres System.Xml.

' Assume this project has a reference to System.Xml
' The following statement must precede all your declarations.
Imports System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As XmlDocument

Asimismo, la instrucción Imports puede definir un alias de importación para cada espacio de nombres importado. De esta forma el código fuente es más corto y más fácil de leer. En el ejemplo siguiente se escribe de nuevo el ejemplo anterior para utilizar xD como un alias para el espacio de nombres System.Xml.

' Assume this project has a reference to System.Xml
' The following statement must precede all your declarations.
Imports xD = System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As xD.XmlDocument

La instrucción Imports no hace que los elementos de otros proyectos estén disponibles para su aplicación. Es decir, no sustituye a la configuración de una referencia. La importación de un espacio de nombres sencillamente evita la necesidad de calificar los nombres definidos en él.

También puede utilizar la instrucción Imports para importar módulos, clases, estructuras y enumeraciones. Después puede utilizar los miembros de estos elementos importados sin calificación. No obstante, debe calificar siempre los miembros no compartidos de clases y estructuras con una variable o expresión que se evalúe en una instancia de la clase o estructura.

Instrucciones de nomenclatura

Si se definen dos o más elementos de programación con el mismo nombre, puede producirse una ambigüedad de nombres cuando el compilador intente resolver una referencia al nombre. Si hay más de una definición en el ámbito, o no hay ninguna, la referencia es irresoluble. Para obtener un ejemplo, vea el "Ejemplo de referencia calificada" en esta página Ayuda.

Puede evitar la ambigüedad de nombres si asigna a todos los elementos nombres únicos. Puede hacer referencia a cualquier elemento sin necesidad de calificar su nombre con un espacio de nombres, módulo o clase. También reduce las posibilidades de hacer referencia accidentalmente a un elemento equivocado.

Sombrear

Si dos elementos de programación comparten el mismo nombre, uno de ellos puede ocultar o sombrear al otro. No hay un elemento sombreado como referencia; en su lugar, cuando el código usa el nombre del elemento sombreado, el compilador de Visual Basic lo resuelve en el elemento que sombrea. Para obtener una explicación más detallada, con ejemplos, vea Sombrear en Visual Basic.

Vea también

Tareas

Cómo: Modificar las propiedades y los valores de configuración del proyecto

Referencia

Instrucción Imports (Tipo y espacio de nombres de .NET)

New (Operador, Visual Basic)

Public (Visual Basic)

Conceptos

Nombres de elementos declarados (Visual Basic)

Características de los elementos declarados (Visual Basic)

Variables en Visual Basic