Compartir a través de


Referencias a elementos declarados (Visual Basic)

Cuando su código hace referencia a un elemento declarado, el compilador de Visual Basic asocia el nombre en su referencia con la declaración apropiada 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 estrecho. Esto significa que comienza con el código que hace la referencia y se extiende hacia afuera a través de niveles sucesivos de elementos que lo contienen.

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 en el 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  

Calificar un nombre de elemento

Si desea invalidar este proceso de búsqueda y especificar un nombre declarado en un ámbito más amplio, debe calificar 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.

Calificar un nombre significa precederlo en la declaración original con información que identifica dónde se define el elemento objetivo. Esta información se denomina cadena de calificación. Puede incluir uno o varios espacios de nombres y un módulo, clase o estructura.

La cadena de calificació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 se puede ubicar 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 calificando 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 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 calificació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, la clase o la estructura que contiene el elemento de destino. Cada elemento de la ruta de acceso debe contener el elemento que lo sigue.

    outerSpace innerSpace → → → holdsTotalstotals

  3. Prepare la cadena de habilitación del elemento de destino. Coloque un punto (.) después de cada elemento de la ruta. La aplicación debe tener acceso a todos los elementos de la cadena de 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. 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 usa la cadena de calificación para buscar 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 calificar una referencia de nombre si la aplicación tiene acceso a más de un elemento de programación que tenga el mismo nombre. Por ejemplo, los espacios de nombres System.Windows.Forms y System.Web.UI.WebControls contienen la clase Label (System.Windows.Forms.Label y System.Web.UI.WebControls.Label). Si la aplicación usa ambos o si define su propia Label clase, debe distinguir los distintos Label objetos. 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 calificar 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 se puede usar el propio nombre de clase para calificar un miembro que no sea Compartido. Primero debe crear una instancia en una variable de objeto (en este caso demoClass) y, a continuación, hacer referencia a ella por el nombre de la variable.

Si una clase o estructura tiene un Shared miembro, puede calificar 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 calificadas a los procedimientos de miembro del módulo. En el ejemplo se declaran dos Sub procedimientos, ambos denominados perform, en módulos diferentes de un proyecto. Cada uno se puede especificar sin cualificación dentro de su propio módulo, pero debe calificarse si se hace referencia desde cualquier otro lugar. Dado que 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  

Referencias a proyectos

Para usar 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 línea de comandos -reference (Visual Basic ).

Por ejemplo, puede usar el modelo de objetos XML de .NET Framework. Si establece una referencia al System.Xml espacio de nombres, puede declarar y usar cualquiera de sus clases, como XmlDocument. En el ejemplo siguiente se usa 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 calificar completamente sus nombres. El siguiente ejemplo reescribe 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 Imports instrucción 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 siguiente ejemplo se reescribe el ejemplo anterior para usar xD como 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 la aplicación. Es decir, no reemplaza el establecer una referencia. La importación de un espacio de nombres solo quita el requisito de calificar los nombres definidos en ese espacio de nombres.

También puede usar la Imports instrucción 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.

Directrices de nomenclatura

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

Puede evitar la ambigüedad de nombres proporcionando todos los nombres únicos de los elementos. A continuación, puede hacer referencia a cualquier elemento sin tener que calificar 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 sombra, el otro. Un elemento sombreado no está disponible para referencia; en su lugar, cuando el código usa el nombre del elemento sombreado, el compilador de Visual Basic lo resuelve en el elemento de sombreado. Para obtener una explicación más detallada con ejemplos, vea Shadowing in Visual Basic (Sombreado en Visual Basic).

Consulte también