Referências a elementos declarados (Visual Basic)

Quando seu código se refere a um elemento declarado, o compilador do Visual Basic corresponde ao nome em sua referência para a 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 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 que faz a referência e trabalha para fora através de níveis sucessivos de elementos de contenção.

O exemplo a seguir mostra referências a duas variáveis com o mesmo nome. O exemplo declara duas variáveis, cada uma com o nome totalCount, em diferentes níveis de escopo no módulo container. Quando o procedimento showCount é exibido 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 showCountdo . Quando ele se qualifica totalCount com o módulo containerque contém, 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 quiser substituir esse processo de pesquisa e especificar um nome declarado em um escopo mais amplo, você deve qualificar o nome com o elemento que contém o escopo mais amplo. Em alguns casos, você também pode ter que qualificar o elemento que contém.

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

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

Para acessar um elemento declarado qualificando seu nome

  1. Determine o local em que 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, prossiga 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.

    outerSpaceinnerSpace → → holdsTotalstotals

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

    outerSpace.innerSpace.holdsTotals.totals.  
    
  4. Escreva a expressão ou a instrução de atribuição referente ao elemento de destino da maneira 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.

Também pode ser necessário qualificar uma referência de nome se seu aplicativo tiver acesso a mais de um elemento de programação com o mesmo nome. Por exemplo, os System.Windows.Forms namespaces e System.Web.UI.WebControls contêm uma Label classe (System.Windows.Forms.Label e System.Web.UI.WebControls.Label). Se seu aplicativo usa ambos, ou se ele define sua própria Label classe, você deve distinguir os diferentes Label objetos. Inclua o namespace ou o alias de importação na declaração da 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, você deve primeiro 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)]  

Não é possível usar o próprio nome da classe para qualificar um membro que não é compartilhado. Você deve primeiro criar uma instância em uma variável de objeto (neste caso demoClass) e, em seguida, fazer referência a ela pelo nome da variável.

Se uma classe ou estrutura tiver um Shared membro, você poderá qualificá-lo com o nome da classe ou 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 Sub procedimentos, 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 Public definidos em outro projeto, você deve primeiro definir uma referência à assembly ou biblioteca de tipos desse projeto. Para definir uma referência, clique em Adicionar referência no menu Projeto ou use a opção de 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 System.Xml namespace, poderá declarar e usar qualquer uma de suas classes, como XmlDocument. O exemplo a seguir usa XmlDocumento .

' 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 contendo

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

Além disso, a Imports instrução 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 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  

A Imports declaração não disponibiliza elementos de outros projetos para a sua candidatura. Ou seja, não substitui a definição de uma referência. A importação de um namespace apenas remove o requisito para qualificar os nomes definidos nesse namespace.

Você também pode usar a Imports instrução para importar módulos, classes, estruturas e enumerações. Você pode então 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 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 âmbito de aplicação, ou se nenhuma definição estiver no âmbito de aplicação, a referência é irresolúvel. Para obter um exemplo, consulte "Exemplo de referência qualificada" nesta página de Ajuda.

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

Sombreamento

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

Consulte também