Namespaces no Visual Basic
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 impedem a ambiguidade e simplificam as 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 seguinte fragmento de código mostra como declarar uma variável usando o nome totalmente qualificado para esta classe:
Dim LBox As System.Windows.Forms.ListBox
Evitando colisões de nome
.NET Framework namespaces resolvem um problema às vezes chamado de poluição de namespace, no qual o desenvolvedor de uma biblioteca de classes é dificultado 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 de seu projeto sem qualificação. No entanto, se você quiser usar a classe .NET Framework ListBox no mesmo projeto, deverá 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 o controle de botão:
' 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
:
Por padrão, cada arquivo executável criado com Visual Basic contém um namespace com o mesmo nome do projeto. Por exemplo, se você definir um objeto dentro de um projeto nomeado ListBoxProject
, o arquivo executável ListBoxProject.exe conterá um namespace chamado ListBoxProject
.
Vários assemblies podem usar o mesmo namespace. O Visual Basic os trata como um único conjunto de nomes. Por exemplo, você pode definir classes para um namespace chamado SomeNameSpace
em um assembly nomeado Assemb1
e definir classes adicionais para o mesmo namespace de um assembly chamado Assemb2
.
Nomes totalmente qualificados
Nomes totalmente qualificados são referências de objeto que são prefixadas com o nome do namespace no qual o objeto é 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 impedem conflitos de nomenclatura porque possibilitam que o compilador determine qual objeto está sendo usado. No entanto, os próprios nomes 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 eles sejam exclusivos para o projeto. Se o projeto contiver Imports
instruções para namespaces que contenham itens com o mesmo nome, você deverá qualificar totalmente esse nome quando usá-lo. Suponha, por exemplo, que seu projeto contiver as duas Imports
instruçõ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
Em um namespace, você pode definir itens como módulos, interfaces, classes, delegados, enumerações, estruturas e outros namespaces. Você não pode 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ê tiver definido uma hierarquia aninhada de namespaces, o código dentro dessa hierarquia poderá 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.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, System.Int32pois 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 .NET Framework. Isso permite que você especifique o System namespace ou qualquer outro namespace na biblioteca de classes. O exemplo a seguir ilustra essa situação.
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 definir um namespace fora do namespace raiz do projeto.
Todos os namespaces no projeto são baseados no namespace raiz do projeto. O Visual Studio atribui o nome do projeto como o namespace raiz padrão para todos os códigos no projeto. Por exemplo, se o projeto for nomeado ConsoleApplication1
, os elementos de programação pertencem ao namespace ConsoleApplication1
. Se você declarar Namespace Magnetosphere
, as referências no Magnetosphere
projeto acessarão ConsoleApplication1.Magnetosphere
.
Os exemplos a seguir usam a Global
palavra-chave para declarar um namespace fora do namespace raiz do projeto.
Namespace Global.Magnetosphere
End Namespace
Namespace Global
Namespace Magnetosphere
End Namespace
End Namespace
Em uma declaração de namespace, Global
não é possível aninhar em outro namespace.
Você pode usar a Página do Aplicativo, o Designer de Projeto (Visual Basic) para exibir e modificar o namespace raiz do projeto. Para novos projetos, o Namespace Raiz usa como padrão o nome do projeto. Para causar Global
o namespace de nível superior, você pode limpar a entrada do Namespace Raiz para que a caixa esteja vazia. Limpar namespace raiz remove a necessidade da Global
palavra-chave em declarações de namespace.
Se uma Namespace
instrução declarar um nome que também é um namespace no .NET Framework, o namespace .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 .NET Framework sem usar a Global
palavra-chave, você pode incluir a Global
palavra-chave na Namespace
instrução.
O exemplo a seguir tem a Global
palavra-chave na declaração de System.Text
namespace.
Se a Global
palavra-chave não estava presente na declaração de namespace, StringBuilder não foi possível acessar sem especificar Global.System.Text.StringBuilder
. Para um projeto nomeado ConsoleApplication1
, as referências seriam System.Text
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