namespace
A palavra-chave namespace
é usada para declarar um escopo que contém um conjunto de objetos relacionados. Você pode usar um namespace para organizar elementos de código e criar tipos globalmente exclusivos.
namespace SampleNamespace
{
class SampleClass { }
interface ISampleInterface { }
struct SampleStruct { }
enum SampleEnum { a, b }
delegate void SampleDelegate(int i);
namespace Nested
{
class SampleClass2 { }
}
}
As declarações de namespace em escopo de arquivo permitem declarar que todos os tipos em um arquivo estão em um único namespace. As declarações de namespace com escopo de arquivo estão disponíveis com o C# 10. O exemplo a seguir é semelhante ao exemplo anterior, mas usa uma declaração de namespace em escopo de arquivo:
using System;
namespace SampleFileScopedNamespace;
class SampleClass { }
interface ISampleInterface { }
struct SampleStruct { }
enum SampleEnum { a, b }
delegate void SampleDelegate(int i);
Usando instruções em namespaces com escopo de arquivo
Ao usar namespaces com escopo de arquivo, o posicionamento de using
instruções afeta seu escopo dentro do arquivo. Namespaces com escopo de arquivo inferiores à declaração de namespace tradicional equivalente que termina com um colchete de fechamento no final do arquivo. Esse comportamento determina onde using
as diretivas são aplicadas da seguinte maneira:
- Se as
using
instruções forem colocadas antes da declaração de namespace com escopo de arquivo, elas serão tratadas como estando fora do namespace e serão interpretadas como namespaces totalmente qualificados. - Se as
using
instruções forem colocadas após a declaração de namespace com escopo de arquivo, elas terão como escopo o próprio namespace.
Por exemplo:
// This using is outside the namespace scope, so it applies globally
using System;
namespace SampleNamespace; // File-scoped namespace declaration
// This using is inside the namespace scope
using System.Text;
public class SampleClass
{
// Class members...
}
No exemplo acima, System
é globalmente acessível, enquanto System.Text
se aplica somente dentro de SampleNamespace
.
O exemplo anterior não inclui um namespace aninhado. Namespaces com escopo de arquivo não podem incluir declarações de namespace adicionais. Você não pode declarar um namespace aninhado ou um segundo namespace com escopo de arquivo:
namespace SampleNamespace;
class AnotherSampleClass
{
public void AnotherSampleMethod()
{
System.Console.WriteLine(
"SampleMethod inside SampleNamespace");
}
}
namespace AnotherNamespace; // Not allowed!
namespace ANestedNamespace // Not allowed!
{
// declarations...
}
Dentro de um namespace, é possível declarar zero ou mais dos seguintes tipos:
- class
- interface
- struct
- enumeração
- delegate
- namespaces aninhados podem ser declarados, exceto em declarações de namespace com escopo de arquivo
O compilador adiciona um namespace padrão. Este namespace sem nome, às vezes chamado de namespace global, está presente em todos os arquivos. Ele contém declarações não incluídas em um namespace declarado. Qualquer identificador no namespace global está disponível para uso em um namespace nomeado.
Os namespaces têm acesso público implicitamente. Para uma discussão sobre os modificadores de acesso que você pode atribuir a elementos em um namespace, consulte Modificadores de acesso.
É possível definir um namespace em duas ou mais declarações. Por exemplo, o exemplo a seguir define duas classes como parte do namespace MyCompany
:
namespace MyCompany.Proj1
{
class MyClass
{
}
}
namespace MyCompany.Proj1
{
class MyClass1
{
}
}
O exemplo a seguir mostra como chamar um método estático em um namespace aninhado.
namespace SomeNameSpace
{
public class MyClass
{
static void Main()
{
Nested.NestedNameSpaceClass.SayHello();
}
}
// a nested namespace
namespace Nested
{
public class NestedNameSpaceClass
{
public static void SayHello()
{
Console.WriteLine("Hello");
}
}
}
}
// Output: Hello
Especificação da linguagem C#
Para saber mais, confira a seção Namespaces da Especificação da linguagem C#. Para obter mais informações sobre declarações de namespace com escopo de arquivo, consulte a especificação do recurso.