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 showCount
do . Quando ele se qualifica totalCount
com o módulo container
que 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
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
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.
outerSpace
innerSpace
→ →holdsTotals
→totals
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.
Escreva a expressão ou a instrução de atribuição referente ao elemento de destino da maneira normal.
grandTotal = 9000
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
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.