Promoção de Tipo
Quando você declara um elemento de programação em um módulo, Visual Basic promove seu escopo para o namespace que contém o módulo.Isso é conhecido como promoção de tipos.
O exemplo a seguir mostra a definição do esqueleto de um módulo e dois membros desse módulo.
Namespace projNamespace
Module projModule
Public Enum basicEnum As Integer
one = 1
two = 2
End Enum
Public Class innerClass
Public Sub numberSub(ByVal firstArg As Integer)
End Sub
End Class
End Module
End Namespace
Em projModule, elementos de programação declarados no nível de módulo são promovidos para projNamespace.No exemplo anterior, basicEnum e innerClass são promovidos, mas numberSub não é, pois ele não está declarado no nível de um módulo.
Efeito da Promoção de Tipo
O efeito da promoção de tipos é que uma sequência de qualificação não precisa incluir o nome do módulo.O exemplo a seguir faz duas chamadas para o procedimento no exemplo anterior.
Sub usePromotion()
projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub
No exemplo anterior, a primeira chamada usa sequências de qualificação completa.No entanto, isso não é necessário, por causa da promoção de tipos.A segunda chamada também acessa os membros do módulo, sem incluir projModule nas sequências de qualificação.
Falha da Promoção de Tipo
Se o namespace já tiver um membro com o mesmo nome como um módulo membro, a promoção de tipos é derrotada por esse módulo associado.O exemplo a seguir mostra um esqueleto da definição de uma enumeração e de um módulo no mesmo namespace.
Namespace thisNamespace
Public Enum abc
first = 1
second
End Enum
Module thisModule
Public Class abc
Public Sub abcSub()
End Sub
End Class
Public Class xyz
Public Sub xyzSub()
End Sub
End Class
End Module
End Namespace
No exemplo anterior, Visual Basic, não é possível promover a classe abc para thisNameSpace pois já há uma enumeração com o mesmo nome no nível de namespace.Para acessar abcSub, você deve usar a sequência completa de qualificação thisNamespace.thisModule.abc.abcSub.No entanto, a classe xyz ainda é promovida, e você pode acessar xyzSub com a sequência de caracteres derrotada mais curta thisNamespace.xyz.xyzSub.
Derrota da Promoção de Tipos para Tipos Parciais
Se uma classe ou estrutura em um módulo usa a palavra-chave Partial (Visual Basic), a promoção de tipos é derrotada automaticamente por essa classe ou estrutura, caso o namespace tenha um membro com o mesmo nome ou não.Outros elementos no módulo ainda são qualificados para promoção de tipos.
Consequências. Derrota da promoção de tipos de uma definição parcial pode causar resultados inesperados e até mesmo erros de compilação.O exemplo a seguir mostra o esqueleto de definições parciais de uma classe, uma das quais está em um módulo.
Namespace sampleNamespace
Public Partial Class sampleClass
Public Sub sub1()
End Sub
End Class
Module sampleModule
Public Partial Class sampleClass
Public Sub sub2()
End Sub
End Class
End Module
End Namespace
No exemplo anterior, o desenvolvedor pode esperar o compilador para mesclar as duas definições parciais de sampleClass.No entanto, o compilador não considera a promoção para a definição parcial dentro de sampleModule.Como resultado, ele tenta compilar duas classes separados e distintas, ambas chamadas sampleClass, mas com caminhos diferentes de qualificação.
O compilador mescla definições parciais somente quando seus caminhos totalmente qualificado são idênticos.
Recomendações
As recomendações a seguir representam boas práticas de programação.
Nomes exclusivos. Quando você tem controle total sobre a nomeação de elementos de programação, é sempre uma boa ideia usar nomes exclusivos em todos os lugares.Nomes idênticos exigem qualificação extra e podem tornar seu código mais difícil de ler.Eles também podem levar a erros sutis e resultados inesperados.
Qualificação completa. Quando você estiver trabalhando com módulos e outros elementos no mesmo namespace, a abordagem mais segura é usar sempre qualificação completa para todos os elementos de programação.Se a promoção de tipos for derrotada por um membro de um módulo e você não qualificar esse membro totalmente, você poderá acessar inadvertidamente um elemento de programação diferente.
Consulte também
Tarefas
Como: O escopo de uma variável de controle
Conceitos
Resolvendo uma Referência Quando Várias Variáveis Têm o Mesmo Nome