Namespaces no Visual Basic

Os namespaces organizam os objetos definidos em um assembly. Os assemblies podem conter vários namespaces, que por sua vez podem conter outros namespaces. Os namespaces evitam ambiguidade e simplificam referências ao usar grandes grupos de objetos, como bibliotecas de classes.

Por exemplo, o .NET Framework define a ListBox classe no System.Windows.Forms namespace. O fragmento de código a seguir mostra como declarar uma variável usando o nome totalmente qualificado para essa classe:

Dim LBox As System.Windows.Forms.ListBox

Evitando colisões de nomes

Os namespaces do .NET Framework abordam um problema às vezes chamado poluição de namespace, no qual o desenvolvedor de uma biblioteca de classes é prejudicado pelo uso de nomes semelhantes em outra biblioteca. Esses conflitos com componentes existentes às vezes são chamados de colisões de nome.

Por exemplo, se você criar uma nova classe chamada ListBox, poderá usá-la dentro do seu projeto sem qualificação. No entanto, se você quiser usar a classe .NET Framework ListBox no mesmo projeto, você deve usar uma referência totalmente qualificada para tornar a referência exclusiva. Se a referência não for exclusiva, o Visual Basic produzirá um erro informando que o nome é ambíguo. O exemplo de código a seguir demonstra como declarar esses objetos:

' Define a new object based on your ListBox class.
Dim LBC As New ListBox
' Define a new Windows.Forms ListBox control.
Dim MyLB As New System.Windows.Forms.ListBox

A ilustração a seguir mostra duas hierarquias de namespace, ambas contendo um objeto chamado ListBox:

Screenshot that shows two namespace hierarchies.

Por padrão, cada arquivo executável que você cria com o Visual Basic contém um namespace com o mesmo nome do seu projeto. Por exemplo, se você definir um objeto dentro de um projeto chamado ListBoxProject, o arquivo executável ListBoxProject.exe contém um namespace chamado ListBoxProject.

Vários assemblies podem usar o mesmo namespace. Visual Basic trata-os como um único conjunto de nomes. Por exemplo, você pode definir classes para um namespace chamado SomeNameSpace em um assembly chamado Assemb1, e definir classes adicionais para o mesmo namespace a partir de um assembly chamado Assemb2.

Nomes totalmente qualificados

Nomes totalmente qualificados são referências de objeto prefixadas com o nome do namespace no qual o objeto está definido. Você pode usar objetos definidos em outros projetos se criar uma referência à classe (escolhendo Adicionar referência no menu Projeto ) e, em seguida, usar o nome totalmente qualificado para o objeto em seu código. O fragmento de código a seguir mostra como usar o nome totalmente qualificado para um objeto do namespace de outro projeto:

Dim LBC As New ListBoxProject.Form1.ListBox

Nomes totalmente qualificados evitam conflitos de nomenclatura porque possibilitam que o compilador determine qual objeto está sendo usado. No entanto, os nomes em si podem ficar longos e complicados. Para contornar isso, você pode usar a Imports instrução para definir um alias — um nome abreviado que você pode usar no lugar de um nome totalmente qualificado. Por exemplo, o exemplo de código a seguir cria aliases para dois nomes totalmente qualificados e usa esses aliases para definir dois objetos.

Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
Dim LBC As LBControl
Dim MyLB As MyListBox

Se você usar a Imports instrução sem um alias, poderá usar todos os nomes nesse namespace sem qualificação, desde que sejam exclusivos para o projeto. Se seu projeto contém Imports instruções para namespaces que contêm itens com o mesmo nome, você deve qualificar totalmente esse nome quando usá-lo. Suponhamos, por exemplo, que seu projeto contivesse as duas Imports declarações a seguir:

' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2

Se você tentar usar Class1 sem qualificá-lo totalmente, o Visual Basic produzirá um erro informando que o nome Class1 é ambíguo.

Instruções de nível de namespace

Dentro de um namespace, você pode definir itens como módulos, interfaces, classes, delegados, enumerações, estruturas e outros namespaces. Não é possível definir itens como propriedades, procedimentos, variáveis e eventos no nível do namespace. Esses itens devem ser declarados dentro de contêineres, como módulos, estruturas ou classes.

Palavra-chave global em nomes totalmente qualificados

Se você definiu uma hierarquia aninhada de namespaces, o código dentro dessa hierarquia pode ser impedido de acessar o System namespace do .NET Framework. O exemplo a seguir ilustra uma hierarquia na qual o namespace bloqueia o SpecialSpace.System acesso ao System.

Namespace SpecialSpace  
    Namespace System  
        Class abc  
            Function getValue() As System.Int32  
                Dim n As System.Int32  
                Return n  
            End Function  
        End Class  
    End Namespace  
End Namespace  

Como resultado, o compilador do Visual Basic não pode resolver com êxito a referência para System.Int32, porque SpecialSpace.System não define Int32. Você pode usar a Global palavra-chave para iniciar a cadeia de qualificação no nível mais externo da biblioteca de classes do .NET Framework. Isso permite que você especifique o System namespace ou qualquer outro namespace na biblioteca de classes. O exemplo a seguir ilustra isso.

Namespace SpecialSpace  
    Namespace System  
        Class abc  
            Function getValue() As Global.System.Int32  
                Dim n As Global.System.Int32  
                Return n  
            End Function  
        End Class  
    End Namespace  
End Namespace  

Você pode usar Global para acessar outros namespaces de nível raiz, como Microsoft.VisualBasic, e qualquer namespace associado ao seu projeto.

Palavra-chave global em instruções de namespace

Você também pode usar a Global palavra-chave em uma instrução Namespace. Isso permite que você defina um namespace fora do namespace raiz do seu projeto.

Todos os namespaces em seu projeto são baseados no namespace raiz do projeto. Visual Studio atribui o nome do projeto como o namespace raiz padrão para todo o código em seu projeto. Por exemplo, se o seu projeto for nomeado ConsoleApplication1, seus elementos de programação pertencem ao namespace ConsoleApplication1. Se você declarar Namespace Magnetosphere, as referências no Magnetosphere projeto acessarão ConsoleApplication1.Magnetosphereo .

Os exemplos a seguir usam a Global palavra-chave para declarar um namespace fora do namespace raiz para o projeto.

Namespace Global.Magnetosphere

End Namespace


Namespace Global
    Namespace Magnetosphere

    End Namespace
End Namespace

Em uma declaração de namespace, Global não pode ser aninhado em outro namespace.

Você pode usar a página do aplicativo, Project Designer (Visual Basic) para exibir e modificar o namespace raiz do projeto. Para novos projetos, o namespace raiz assume como padrão o nome do projeto. Para fazer com Global que seja o namespace de nível superior, você pode limpar a entrada Namespace raiz para que a caixa fique vazia. Limpar o namespace raiz remove a necessidade da Global palavra-chave nas declarações de namespace.

Se uma Namespace instrução declarar um nome que também é um namespace no .NET Framework, o namespace do .NET Framework ficará indisponível se a Global palavra-chave não for usada em um nome totalmente qualificado. Para habilitar o acesso a esse namespace do .NET Framework sem usar a palavra-chave Global , você pode incluir a GlobalNamespace palavra-chave na instrução.

O exemplo a seguir tem a Global palavra-chave na System.Text declaração de namespace.

Se a Global palavra-chave não estava presente na declaração de namespace, StringBuilder não poderia ser acessado sem especificar Global.System.Text.StringBuilder. Para um projeto chamado ConsoleApplication1, as referências a System.Text seriam acessadas ConsoleApplication1.System.Text se a Global palavra-chave não fosse usada.

Module Module1
    Sub Main()
        Dim encoding As New System.Text.TitanEncoding

        ' If the namespace defined below is System.Text
        ' instead of Global.System.Text, then this statement
        ' causes a compile-time error.
        Dim sb As New System.Text.StringBuilder
    End Sub
End Module

Namespace Global.System.Text
    Class TitanEncoding

    End Class
End Namespace

Consulte também