Referências a elementos declarados (Visual Basic)

Quando o código se refere a um elemento declarado, o compilador do Visual Basic corresponde ao nome em sua referência à declaração apropriada desse nome. Se mais de um elemento for declarado com o mesmo nome, você poderá controlar qual desses elementos deve ser referenciado qualificando o seu nome.

O compilador tenta corresponder uma referência de nome a uma declaração de nome com o escopo mais estreito. Isso significa que ele começa com o código fazendo a referência e passa de dentro para fora pelos níveis sucessivos de elementos contidos.

O exemplo a seguir mostra referências a duas variáveis com o mesmo nome. O exemplo declara duas variáveis, cada uma nomeada totalCount, em diferentes níveis de escopo no módulo container. Quando o procedimento showCount exibe totalCount sem qualificação, o compilador do Visual Basic resolve a referência à declaração com o escopo mais estreito, ou seja, a declaração local dentro de showCount. Quando ele qualifica totalCount com o módulo que contém container, o compilador resolve a referência à declaração com o escopo mais amplo.

' 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  

Qualificando um nome de elemento

Se você quiser substituir esse processo de pesquisa e especificar um nome declarado em um escopo mais amplo, deverá qualificar o nome com o elemento que contém o escopo mais amplo. Em alguns casos, talvez você também precise qualificar o elemento que contém.

Qualificar um nome significa precedê-lo na sua instrução de origem com informações que identificam onde o elemento de destino está definido. Essa informação é chamada de cadeia de caracteres de qualificação. Ela pode incluir um ou mais namespaces e um módulo, classe ou estrutura.

A cadeia de caracteres de qualificação deve especificar de modo inequívoco o módulo, a classe ou a estrutura que contém o elemento de destino. Por sua vez, o contêiner pode estar localizado em outro elemento que contém, geralmente um namespace. Talvez seja necessário incluir vários elementos que contêm na cadeia de caracteres de qualificação.

Para acessar um elemento declarado qualificando seu nome

  1. Determine o local no qual o elemento foi definido. Isso pode incluir um namespace ou até mesmo uma hierarquia de namespaces. Dentro do namespace de nível mais baixo, o elemento deve estar contido em um módulo, classe ou estrutura.

    ' 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 um caminho de qualificação com base no local do elemento de destino. Comece com o namespace de nível mais alto, vá para o namespace de nível mais baixo e termine com o módulo, classe ou estrutura que contém o elemento de destino. Cada elemento no caminho deve conter o elemento que o segue.

    outerSpaceinnerSpaceholdsTotalstotals

  3. Prepare a cadeia de caracteres de qualificação para o elemento de destino. Coloque um período (.) após cada elemento no caminho. Seu aplicativo deve ter acesso a cada elemento em sua cadeia de caracteres de qualificação.

    outerSpace.innerSpace.holdsTotals.totals.  
    
  4. Escreva a expressão ou a instrução de atribuição referindo-se ao elemento de destino do modo normal.

    grandTotal = 9000  
    
  5. Preceda o nome do elemento de destino com a cadeia de caracteres de qualificação. O nome deve seguir imediatamente o período (.) que segue o módulo, classe ou estrutura que contém o 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. O compilador usa a cadeia de caracteres de qualificação para encontrar uma declaração clara e inequívoca à qual ele pode corresponder à referência do elemento de destino.

Talvez você também precise qualificar uma referência de nome se seu aplicativo tiver acesso a mais de um elemento de programação que tenha o mesmo nome. Por exemplo, os namespaces System.Windows.Forms e System.Web.UI.WebControls contém uma classe Label (System.Windows.Forms.Label e System.Web.UI.WebControls.Label). Se o aplicativo usar ambos ou se ele definir sua própria classe Label, você deve distinguir os diferentes objetos Label. Inclua o namespace ou o alias de importação na declaração de variável. O exemplo a seguir usa o alias de importação.

' 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()  

Membros de outros elementos que contêm

Ao usar um membro não compartilhado de outra classe ou estrutura, primeiro você deve qualificar o nome do membro com uma variável ou expressão que aponte para uma instância da classe ou estrutura. No exemplo a seguir, demoClass é uma instância de uma classe chamada class1.

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

Você não pode usar o próprio nome de classe para qualificar um membro que não é compartilhado. Primeiro você deve criar uma instância em uma variável de objeto (nesse caso demoClass) e, em seguida, referenciá-la pelo nome da variável.

Se uma classe ou estrutura tiver um membro Shared, você poderá qualificar esse membro com o nome da classe ou da estrutura ou com uma variável ou expressão que aponte para uma instância.

Um módulo não tem instâncias separadas e todos os seus membros são Shared por padrão. Portanto, você qualifica um membro do módulo com o nome do módulo.

O exemplo a seguir mostra referências qualificadas aos procedimentos de membro do módulo. O exemplo declara dois procedimentos Sub, ambos nomeados perform, em módulos diferentes em um projeto. Cada um pode ser especificado sem qualificação dentro de seu próprio módulo, mas deve ser qualificado se referenciado de qualquer outro lugar. Como a referência final em module3 não se qualifica perform, o compilador não pode resolver essa referência.

' 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  

Referências a projetos

Para usar elementos públicos definidos em outro projeto, primeiro você deve definir uma referência à biblioteca de tipos ou assembly desse projeto. Para definir uma referência, clique em Adicionar Referência no menu Projeto ou use a opção do compilador de linha de comando -reference (Visual Basic).

Por exemplo, você pode usar o modelo de objeto XML do .NET Framework. Se você definir uma referência ao namespace System.Xml, você poderá declarar e usar qualquer uma de suas classes, como XmlDocument. O exemplo a seguir 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  

Importando elementos que contêm

Você pode usar a Instrução Imports (namespace e tipo .NET) para importar os namespaces que contêm os módulos ou classes que você deseja usar. Isso permite que você consulte os elementos definidos em um namespace importado sem qualificar totalmente seus nomes. O exemplo a seguir reescreve o exemplo anterior para importar o namespace 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  

Além disso, a instrução Imports pode definir um alias de importação para cada namespace importado. Isso pode tornar o código-fonte mais curto e fácil de ler. O exemplo a seguir reescreve o exemplo anterior para usar xD como um alias para o namespace 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  

A instrução Imports não disponibiliza elementos de outros projetos para o seu aplicativo. Ou sela, ela não ocupa o lugar de definir uma referência. Importar um namespace apenas remove o requisito para qualificar os nomes definidos nesse namespace.

Você também pode usar a instrução Imports para importar módulos, classes, estruturas e enumerações. Em seguida, você pode usar os membros desses elementos importados sem qualificação. No entanto, você sempre deve qualificar membros não compartilhados de classes e estruturas com uma variável ou expressão que seja avaliada como uma instância da classe ou estrutura.

Diretrizes de nomenclatura

Quando você define dois ou mais elementos de programação que têm o mesmo nome, uma ambiguidade de nome pode resultar quando o compilador tenta resolver uma referência a esse nome. Se mais de uma definição estiver no escopo ou se nenhuma definição estiver no escopo, a referência será irresolvível. Para obter um exemplo, consulte "Exemplo de referência qualificada" nesta página de ajuda.

Você pode evitar a ambiguidade do nome dando a todos os seus elementos nomes exclusivos. Em seguida, você pode fazer referência a qualquer elemento sem precisar qualificar seu nome com um namespace, módulo ou classe. Você também reduz as chances de fazer referência acidental ao elemento errado.

Sombreamento

Quando dois elementos de programação compartilham o mesmo nome, um deles pode ocultar ou sombrear o outro. Um elemento sombreado não está disponível para referência; em vez disso, quando o código usa o nome do elemento sombreado, o compilador do Visual Basic resolve-o para o elemento de sombreamento. Para obter uma explicação mais detalhada com exemplos, confira Sombreamento no Visual Basic.

Confira também