Share via


Resolver una referencia cuando muchas variables tienen el mismo nombre

Actualización: noviembre 2007

Cuando el compilador intenta hacer coincidir una referencia de nombre con una declaración de nombre, busca la declaración de coincidencia del ámbito más restringido. 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.

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. Para obtener más información sobre la calificación de nombres, vea Cómo: Calificar el nombre de un elemento declarado.

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. Para obtener ejemplos, vea "Clases con el mismo nombre" en esta página Ayuda y Cómo: Distinguir entre dos elementos con el mismo nombre.

Ámbito más restringido

El ejemplo siguiente muestra las referencias a dos variables con el mismo nombre.

' 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

En el ejemplo anterior se declaran dos variables, cada una denominada totalCount, en los diferentes niveles de ámbito en el 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.

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.

Ejemplo de referencia calificada

El ejemplo siguiente muestra referencias calificadas a procedimientos de miembros de módulos.

' 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

En el ejemplo anterior 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.

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.

Clases con el mismo nombre

Cuando se crea una instancia nueva de un objeto, probablemente sea necesario calificar la clase con el espacio de nombres o el tipo de biblioteca al que pertenece. 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()

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.

Vea también

Tareas

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

Cómo: Calificar el nombre de un elemento declarado

Cómo: Distinguir entre dos elementos con el mismo nombre

Conceptos

Variables en Visual Basic

Referencia

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

New (Visual Basic)

Public (Visual Basic)

Otros recursos

Referencias a elementos declarados