Referencias a elementos declarados (Visual Basic)

Cuando el código hace referencia a un elemento declarado, el compilador de Visual Basic hace coincidir el nombre de la referencia con la declaración adecuada de ese nombre. Si se declara más de un elemento con el mismo nombre, puede controlar a cuál de esos elementos se debe hacer referencia mediante la habilitación del nombre.

El compilador intenta hacer coincidir una referencia de nombre a una declaración de nombre con el ámbito más limitado. Esto significa que comienza con el código que hace la referencia y funciona hacia fuera a través de niveles sucesivos de elementos contenedores.

En el ejemplo siguiente se muestran referencias a dos variables con el mismo nombre. En el ejemplo se declaran dos variables, cada una denominada totalCount, en distintos niveles de ámbito del módulo container. Cuando el procedimiento showCount muestra totalCount sin habilitación, el compilador de Visual Basic resuelve la referencia a la declaración con el ámbito más limitado, es decir, la declaración local dentro de showCount. Cuando se habilita totalCount con el módulo contenedor container, el compilador resuelve la referencia a la declaración con el ámbito más amplio.

' 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  

Habilitación de un nombre de elemento

Si desea invalidar este proceso de búsqueda y especificar un nombre declarado en un ámbito más amplio, debe habilitar el nombre con el elemento contenedor del ámbito más amplio. En algunos casos, es posible que también tenga que habilitar el elemento contenedor.

Habilitar un nombre significa anteponer en la instrucción de origen la información que identifique dónde se define el elemento de destino. Esta información se denomina cadena de habilitación. Puede incluir uno o varios espacios de nombres y un módulo, clase o estructura.

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

Para acceder a un elemento declarado mediante la habilitación de su nombre

  1. Determine la ubicación en la que se ha definido el elemento. Esta puede incluir un espacio de nombres o incluso una jerarquía de espacios de nombres. Dentro del espacio de nombres de nivel más bajo, el elemento debe estar contenido en un módulo, una clase o una 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 habilitación basada en la ubicación del elemento de destino. Comience con el espacio de nombres de nivel más alto, continúe con el espacio de nombres de nivel más bajo y termine con el módulo, clase o estructura que contiene el elemento de destino. Cada elemento de la ruta de acceso debe contener el elemento que lo sigue.

    outerSpaceinnerSpaceholdsTotalstotals

  3. Prepare la cadena de habilitación del elemento de destino. Coloque un punto (.) después de cada elemento de la ruta de acceso. La aplicación debe tener acceso a todos los elementos de la cadena de habilitació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. Anteponga al nombre del elemento de destino la cadena de habilitación. El nombre debe seguir inmediatamente al 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 habilitación para encontrar una declaración clara e inequívoca con la que pueda hacer coincidir la referencia del elemento de destino.

También puede que tenga que habilitar una referencia de nombre si su 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 una clase Label (System.Windows.Forms.Label y System.Web.UI.WebControls.Label). Si la aplicación usa ambas o si define su propia clase Label, deberá distinguir entre los distintos objetos Label. Incluya el espacio de nombres o alias de importación en la declaración de variable. En el ejemplo siguiente se usa 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

Cuando se usa un miembro no compartido de otra clase o estructura, primero debe habilitar el nombre del miembro con una variable o expresión que apunte a una instancia de la clase o 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 usar el nombre de clase para habilitar a un miembro no compartido. Primero debe crear una instancia en una variable de objeto (en este caso demoClass) y, a continuación, hacer referencia a ella mediante el nombre de la variable.

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

Un módulo no tiene ninguna instancia independiente y todos sus miembros son Shared de forma predeterminada. Por lo tanto, puede habilitar a un miembro del módulo con el nombre del mismo.

En el ejemplo siguiente se muestran referencias habilitadas a procedimientos de miembro del módulo. En el ejemplo se declaran dos procedimientos Sub, ambos denominados perform, en módulos diferentes de un proyecto. Cada uno se puede especificar sin habilitación dentro de su propio módulo, pero debe estar habilitado si se hace referencia desde cualquier otro lugar. Dado que la referencia final de module3 no habilita a 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  

Referencias a proyectos

Para usar los elementos públicos definidos en otro proyecto, primero debe establecer una referencia a la biblioteca de tipos o ensamblados de ese proyecto. Para establecer una referencia, haga clic en Agregar referencia en el menú Proyecto o use la opción del compilador de la línea de comandos -reference (Visual Basic).

Por ejemplo, puede usar el modelo de objetos XML de .NET Framework. Si establece una referencia al espacio de nombres System.Xml, puede declarar y usar cualquiera de sus clases como, por ejemplo, XmlDocument. En el ejemplo siguiente se 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  

Importación de elementos contenedores

Puede usar la instrucción Imports (espacio de nombres y tipo de .NET) para importar los espacios de nombres que contienen los módulos o clases que desea usar. Esto le permite hacer referencia a los elementos definidos en un espacio de nombres importado sin habilitar completamente sus nombres. En el ejemplo siguiente se vuelve a escribir 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  

Además, la instrucción Imports puede definir un alias de importación para cada espacio de nombres importado. Esto puede hacer que el código fuente sea más corto y fácil de leer. En el ejemplo siguiente se vuelve a escribir el ejemplo anterior para usar xD como alias del 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 la aplicación. Es decir, no sustituye la configuración de una referencia. La importación de un espacio de nombres simplemente elimina el requisito de tener que habilitar los nombres definidos en ese espacio de nombres.

También puede usar la instrucción Imports para importar módulos, clases, estructuras y enumeraciones. A continuación, puede usar los miembros de estos elementos importados sin habilitación. Sin embargo, siempre debe habilitar miembros no compartidos de clases y estructuras con una variable o expresión que se evalúa como una instancia de la clase o estructura.

Instrucciones de nomenclatura

Cuando se definen dos o más elementos de programación que tienen el mismo nombre, se puede producir una ambigüedad de nombres cuando el compilador intente resolver una referencia a ese nombre. Si hay más de una definición en el ámbito, o si no hay ninguna, la referencia no se puede resolver. Para obtener un ejemplo, consulte "Ejemplo de referencia habilitado" en esta página de Ayuda.

Para evitar la ambigüedad de los nombres, asigne a todos los elementos nombres únicos. A continuación, puede hacer referencia a cualquier elemento sin tener que habilitar su nombre con un espacio de nombres, un módulo o una clase. También se reducen las posibilidades de hacer referencia accidentalmente al elemento incorrecto.

Sombreado

Cuando dos elementos de programación comparten el mismo nombre, uno de ellos puede ocultar, o reemplazar, al otro. Un elemento reemplazado no está disponible para referencia; en su lugar, cuando el código usa el nombre del elemento reemplazado, el compilador de Visual Basic lo resuelve en el elemento que realiza el reemplazo. Para obtener una explicación más detallada con ejemplos, consulte Reemplazar en Visual Basic.

Consulte también