Referencias a elementos declarados (Visual Basic)References to Declared Elements (Visual Basic)

Cuando el código hace referencia a un elemento declarado, el compilador de Visual Basic coincide con el nombre de la referencia a la declaración adecuada de ese nombre.When your code refers to a declared element, the Visual Basic compiler matches the name in your reference to the appropriate declaration of that name. Si se declara más de un elemento con el mismo nombre, puede controlar cuál de estos elementos es hacer referencia a calificación su nombre.If more than one element is declared with the same name, you can control which of those elements is to be referenced by qualifying its name.

El compilador intenta hacer coincidir una referencia de nombre a una declaración de nombre con el ámbito más restringido.The compiler attempts to match a name reference to a name declaration with the narrowest scope. Esto significa se inicia con el código que hace la referencia y se lleva a través de los niveles sucesivos de los elementos contenedores.This means it starts with the code making the reference and works outward through successive levels of containing elements.

El ejemplo siguiente muestra las referencias a dos variables con el mismo nombre.The following example shows references to two variables with the same name. En el ejemplo se declara dos variables, cada uno denominado totalCount, en diferentes niveles de ámbito en el módulo container.The example declares two variables, each named totalCount, at different levels of scope in module container. Cuando el procedimiento showCount muestra totalCount sin 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.When the procedure showCount displays totalCount without qualification, the Visual Basic compiler resolves the reference to the declaration with the narrowest scope, namely the local declaration inside showCount. Cuando califica totalCount con el módulo contenedor container, el compilador resuelve la referencia a la declaración con el ámbito más amplio.When it qualifies totalCount with the containing module container, the compiler resolves the reference to the declaration with the broader scope.

' 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 elementoQualifying an Element Name

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.If you want to override this search process and specify a name declared in a broader scope, you must qualify the name with the containing element of the broader scope. En algunos casos, es posible que deba calificar el elemento contenedor.In some cases, you might also have to qualify the containing element.

Calificar un nombre significa que le precede en la instrucción de origen con la información que identifica donde se define el elemento de destino.Qualifying a name means preceding it in your source statement with information that identifies where the target element is defined. Esta información se conoce como un cadena de calificación.This information is called a qualification string. Puede incluir uno o más espacios de nombres y un módulo, clase o estructura.It can include one or more namespaces and a module, class, or structure.

La cadena de calificación debe especificar de forma inequívoca el módulo, clase o estructura que contiene el elemento de destino.The qualification string should unambiguously specify the module, class, or structure containing the target element. El contenedor a su vez puede estar ubicado en otro elemento contenedor, normalmente un espacio de nombres.The container might in turn be located in another containing element, usually a namespace. Es posible que deba incluir varios elementos contenedores en la cadena de calificación.You might need to include several containing elements in the qualification string.

Para obtener acceso a un elemento declarado por su nombreTo access a declared element by qualifying its name

  1. Determinar la ubicación en la que se ha definido el elemento.Determine the location in which the element has been defined. Esto podría incluir un espacio de nombres o incluso una jerarquía de espacios de nombres.This might include a namespace, or even a hierarchy of namespaces. En el espacio de nombres de nivel más bajo, el elemento debe incluirse en un módulo, clase o estructura.Within the lowest-level namespace, the element must be contained in a module, class, or structure.

    ' 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. Determinar una ruta de acceso de calificación según la ubicación del elemento de destino.Determine a qualification path based on the target element's location. Comience con el espacio de nombres de nivel superior, continúe con el espacio de nombres de nivel inferior y terminar con el módulo, clase o estructura que contiene el elemento de destino.Start with the highest-level namespace, proceed to the lowest-level namespace, and end with the module, class, or structure containing the target element. Cada elemento de la ruta de acceso debe incluir el elemento que le sigue.Each element in the path must contain the element that follows it.

    outerSpaceinnerSpaceholdsTotalstotalsouterSpaceinnerSpaceholdsTotalstotals

  3. Prepare la cadena de calificación para el elemento de destino.Prepare the qualification string for the target element. Escriba un punto (.) después de todos los elementos de la ruta de acceso.Place a period (.) after every element in the path. La aplicación debe tener acceso a todos los elementos de la cadena de calificación.Your application must have access to every element in your qualification string.

    outerSpace.innerSpace.holdsTotals.totals.  
    
  4. Escribir la expresión o instrucción de asignación que hace referencia al elemento de destino de la manera normal.Write the expression or assignment statement referring to the target element in the normal way.

    grandTotal = 9000  
    
  5. Delante del nombre de elemento de destino con la cadena de calificación.Precede the target element name with the qualification string. El nombre debe seguir inmediatamente el período (.) que sigue el módulo, clase o estructura que contiene el elemento.The name should immediately follow the period (.) that follows the module, class, or structure that contains the element.

    ' 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 encontrar una declaración, inequívoca a la que puede coincidir con la referencia de elemento de destino.The compiler uses the qualification string to find a clear, unambiguous declaration to which it can match the target element reference.

También es posible que deba calificar una referencia de nombre si la aplicación tiene acceso a más de un elemento de programación que tiene el mismo nombre.You might also have to qualify a name reference if your application has access to more than one programming element that has the same name. Por ejemplo, el System.Windows.Forms y System.Web.UI.WebControls espacios de nombres ambos contienen una Label clase (System.Windows.Forms.Label y System.Web.UI.WebControls.Label).For example, the System.Windows.Forms and System.Web.UI.WebControls namespaces both contain a Label class (System.Windows.Forms.Label and System.Web.UI.WebControls.Label). Si la aplicación utiliza los dos, o bien, si define su propio Label (clase), se deben distinguir los diferentes Label objetos.If your application uses both, or if it defines its own Label class, you must distinguish the different Label objects. Incluir el alias de espacio de nombres o importar en la declaración de variable.Include the namespace or import alias in the variable declaration. El ejemplo siguiente usa el alias de importación.The following example uses the import alias.

' 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 que contieneMembers of Other Containing Elements

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 apunta a una instancia de la clase o estructura.When you use a nonshared member of another class or structure, you must first qualify the member name with a variable or expression that points to an instance of the class or structure. En el ejemplo siguiente, demoClass es una instancia de una clase denominada class1.In the following example, demoClass is an instance of a class named class1.

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

No se puede usar el nombre de la clase para calificar a un miembro que no es Shared.You cannot use the class name itself to qualify a member that is not Shared. Primero debe crear una instancia en una variable de objeto (en este caso demoClass) y, a continuación, haga referencia a él por el nombre de variable.You must first create an instance in an object variable (in this case demoClass) and then reference it by the variable name.

Si una clase o estructura tiene un Shared miembros, puede calificar ese miembro con el nombre de clase o estructura o con una variable o expresión que apunta a una instancia.If a class or structure has a Shared member, you can qualify that member either with the class or structure name or with a variable or expression that points to an instance.

Un módulo no tiene todas las instancias independientes, y todos sus miembros son Shared de forma predeterminada.A module does not have any separate instances, and all its members are Shared by default. Por lo tanto, para calificar al miembro de un módulo con el nombre del módulo.Therefore, you qualify a module member with the module name.

El ejemplo siguiente muestra referencias completas a los procedimientos de miembros de módulo.The following example shows qualified references to module member procedures. El ejemplo declara dos Sub procedimientos, ambos denominados perform, en módulos diferentes de un proyecto.The example declares two Sub procedures, both named perform, in different modules in a project. Cada una de ellas puede especificarse sin calificación en su propio módulo, pero debe ser completa si se hace referencia desde cualquier otro lugar.Each one can be specified without qualification within its own module but must be qualified if referenced from anywhere else. Dado que hacen referencia a la última en module3 no cumple los requisitos perform, el compilador no puede resolver esa referencia.Because the final reference in module3 does not qualify perform, the compiler cannot resolve that reference.

' 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 proyectosReferences to Projects

Para usar pública elementos definidos en otro proyecto, primero debe establecer un referencia del ese proyecto ensamblado o biblioteca de tipos.To use Public elements defined in another project, you must first set a reference to that project's assembly or type library. Para establecer una referencia, haga clic en Agregar referencia en el proyecto menú o use el /Reference (Visual Basic) opción del compilador de línea de comandos.To set a reference, click Add Reference on the Project menu, or use the /reference (Visual Basic) command-line compiler option.

Por ejemplo, puede usar el modelo de objetos XML de .NET Framework.For example, you can use the XML object model of the .NET Framework. Si establece una referencia a la System.Xml espacio de nombres, puede declarar y usar cualquiera de sus clases, como XmlDocument.If you set a reference to the System.Xml namespace, you can declare and use any of its classes, such as XmlDocument. En el ejemplo siguiente se usa XmlDocument.The following example uses 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 contenedoresImporting Containing Elements

Puede usar el instrucción Imports (tipo y Namespace. NET) a importar los espacios de nombres que contienen los módulos o clases que se va a usar.You can use the Imports Statement (.NET Namespace and Type) to import the namespaces that contain the modules or classes that you want to use. Esto le permite hacer referencia a los elementos definidos en un espacio de nombres importado sin calificar por completo sus nombres.This enables you to refer to the elements defined in an imported namespace without fully qualifying their names. El ejemplo siguiente se vuelve a escribir el ejemplo anterior para importar el System.Xml espacio de nombres.The following example rewrites the previous example to import the System.Xml namespace.

' 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, el Imports instrucción puede definir un alias de importación para cada espacio de nombres importado.In addition, the Imports statement can define an import alias for each imported namespace. Esto puede hacer que el código fuente más corto y fácil de leer.This can make the source code shorter and easier to read. El ejemplo siguiente se vuelve a escribir el ejemplo anterior se usan xD como un alias para el System.Xml espacio de nombres.The following example rewrites the previous example to use xD as an alias for the System.Xml namespace.

' 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  

El Imports no hace que los elementos de otros proyectos disponibles para la aplicación.The Imports statement does not make elements from other projects available to your application. Es decir, no tiene lugar de la configuración de una referencia.That is, it does not take the place of setting a reference. Importar un espacio de nombres solo quita el requisito para calificar los nombres definidos en dicho espacio de nombres.Importing a namespace just removes the requirement to qualify the names defined in that namespace.

También puede usar el Imports instrucción para importar módulos, clases, estructuras y enumeraciones.You can also use the Imports statement to import modules, classes, structures, and enumerations. A continuación, puede utilizar a los miembros de estos elementos importados sin calificación.You can then use the members of such imported elements without qualification. Sin embargo, siempre debe calificar a los 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.However, you must always qualify nonshared members of classes and structures with a variable or expression that evaluates to an instance of the class or structure.

Instrucciones de nomenclaturaNaming Guidelines

Cuando se definen dos o más elementos de programación que tienen el mismo nombre, un nombre ambigüedad puede producir cuando el compilador intenta resolver una referencia a ese nombre.When you define two or more programming elements that have the same name, a name ambiguity can result when the compiler attempts to resolve a reference to that name. Si hay más de una definición en el ámbito, o si ninguna definición está en el ámbito, la referencia es irresoluble.If more than one definition is in scope, or if no definition is in scope, the reference is irresolvable. Para obtener un ejemplo, vea "Ejemplo de referencia completo" en esta página de ayuda.For an example, see "Qualified Reference Example" on this Help page.

Puede evitar la ambigüedad de nombre proporcionando nombres únicos a todos los elementos.You can avoid name ambiguity by giving all your elements unique names. A continuación, puede hacer referencia a cualquier elemento sin tener que calificar su nombre con un espacio de nombres, módulo o clase.Then you can make reference to any element without having to qualify its name with a namespace, module, or class. También reduce las posibilidades de accidentalmente que hace referencia a un elemento equivocado.You also reduce the chances of accidentally referring to the wrong element.

SombreadoShadowing

Cuando dos elementos de programación comparten el mismo nombre, puede ocultar uno de ellos, o sombra, otro.When two programming elements share the same name, one of them can hide, or shadow, the other one. Un elemento reemplazado no está disponible para la referencia; en su lugar, cuando el código usa el nombre del elemento reemplazado, el compilador de Visual Basic resuelve en el elemento reemplazado.A shadowed element is not available for reference; instead, when your code uses the shadowed element name, the Visual Basic compiler resolves it to the shadowing element. Para obtener una explicación más detallada con ejemplos, vea sombrear en Visual Basic.For a more detailed explanation with examples, see Shadowing in Visual Basic.

Vea tambiénSee also