Partilhar via


A palavra-chave namespace

A namespace palavra-chave é 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 com escopo de arquivo permitem que você declare que todos os tipos em um arquivo estão em um único namespace. O exemplo a seguir é semelhante ao exemplo anterior, mas usa uma declaração de namespace com 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

Quando você usa 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 declarações using forem colocadas antes da declaração de namespace de âmbito de ficheiro, elas são tratadas como estando fora do namespace e são interpretadas como namespaces totalmente qualificados.
  • Se as instruções using forem colocadas após a declaração de namespace com escopo de arquivo, elas terão escopo dentro do 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 anterior, System é globalmente acessível, enquanto System.Text se aplica apenas dentro SampleNamespace.

O exemplo anterior não inclui um namespace aninhado. Os namespaces com escopo de arquivo não podem incluir mais declarações de namespace. Não é possível 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, você pode declarar zero ou mais dos seguintes tipos:

O compilador adiciona um namespace padrão. Esse 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 implicitamente acesso público. Para obter 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 MyCompany namespace:

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 obter mais informações, consulte 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.

Consulte também