Compartilhar via


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

O Escopo no Visual Basic

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

Referência

Declaração de Módulo

Declaração de namespace

Partial (Visual Basic)