Partilhar via


Resolvendo uma Referência Quando Várias Variáveis Têm o Mesmo Nome

Quando o compilador tenta coincidir uma referência de nome a uma declaração de nome, ele procura a declaração correspondente com o menor escopo .Isso significa que ele começa com o código fazendo a referência e trabalha externamente através de níveis sucessivos de elementos recipientes.

Se você 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 precisa qualificar o elemento que contém.Para obter mais informações sobre qualificação de nome, consulte Como: Qualificar um nome de elemento declarado.

Você pode também ter que qualificar uma referência de nome se seu aplicativo tiver acesso a mais de um elemento de programação que tem o mesmo nome.Para obter exemplos, consulte "Classes com o Mesmo Nome " nessa página da Ajuda e Como: Distinguir entre dois elementos com o mesmo nome.

Menor escopo

O exemplo a seguir mostra as referências a duas variáveis com o mesmo nome.

' 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

O exemplo anterior declara duas variáveis, cada uma nomeada como totalCount em diferentes níveis de escopo no módulo container.Quando o procedimento showCount exibe totalCount sem qualificação, o compilador Visual Basic resolve a referência para a declaração com o menor escopo, como a declaração dentro de showCount.Quando ele qualifica totalCount com o módulo recipiente container,o compilador resolve a referência para a declaração com o escopo mais amplo.

Membros de Outros Elementos Recipientes

Quando você usa 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 aponta para uma instância da classe ou estrutura.No exemplo a seguir, demoClass é uma instância de uma classe denominada 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 é Compartilhamento (Visual Basic).Você deve primeiro criar uma instância em um variável de objeto (nesse caso demoClass) e, em seguida, fazer referência a ela, através do nome de variável.

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

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

Exemplo de Referência Qualificada

O exemplo a seguir mostra referências qualificadas a procedimentos de membro de módulo.

' 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

O exemplo anterior declara dois procedimentos Sub,ambos denominados perform, em diferentes módulos em um projeto.Cada um deles pode ser especificado sem qualificação no seu próprio módulo mas deve ser qualificado se referenciado de qualquer outro lugar.Como referência final em module3 não se qualifica como perform, o compilador não pode resolver essa referência.

Referências a Projetos

Para usar elementos Público (Visual Basic) definidos em outro projeto, você deve primeiro definir uma referência para o conjunto de módulos do projeto (assembly) ou para a biblioteca de tipos.Para definir uma referência, clique em Add Reference no menu Projeto, ou usa a opção do compilador em linha de comando /reference (Visual Basic).

Por exemplo, você pode usar o modelo de objeto XML de .NET Framework.Se você definir uma referência ao namespace System.Xml, você poderá declarar e usar qualquer uma das 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 Recipientes

Você pode usar Declaração Imports (Tipo e Namespace .NET) para import os namespaces que contêm os módulos ou classes que você deseja usar.Isso permite que você se refira aos 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 declaraçã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 declaração Imports não torna os elementos de outros projetos disponíveis para seu aplicativo.Ou seja, ele não definirá uma referência.Importar um namespace apenas remove a necessidade de qualificar nomes definidos nesse namespace.

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

Classes com o Mesmo Nome

Quando você cria uma nova instância de um objeto, você talvez precise qualificar a classe com o namespace ou biblioteca de tipos ao qual ele pertence.Por exemplo, os namespaces System.Windows.Forms e System.Web.UI.WebControls contém ambos uma classe Label (System.Windows.Forms.Label e System.Web.UI.WebControls.Label).Se o aplicativo usa ambas, ou se ele define sua própria classe Label,você deve distinguir os objetos Label diferentes.Inclua o alias do namespace ou de importação na declaração de variável.O exemplo a seguir utiliza 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()

Nomeando Diretrizes

Quando você define dois ou mais elementos de programação que têm o mesmo nome, uma ambiguidade de nomes pode resultar quando o compilador tenta resolver uma referência a esse nome.Se mais de uma definição estiver em escopo, ou se nenhuma definição estiver em escopo, não é possível resolver a referência..Para obter um exemplo, consulte "Exemplo de Referência Qualificada " nessa página da Ajuda.

Você pode evitar ambiguidade de nomes fornecendo nomes exclusivos a todos os seus elementos.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 reduzir as chances de acidentalmente se referir ao elemento errado.

Consulte também

Tarefas

Como: Modificar propriedades do projeto e definições de configuração

Como: Qualificar um nome de elemento declarado

Como: Distinguir entre dois elementos com o mesmo nome

Conceitos

Variáveis no Visual Basic

Referência

Declaração Imports (Tipo e Namespace .NET)

Novo (Visual Basic)

Público (Visual Basic)

Outros recursos

Referências aos elementos declaradas