Namespaces C#

Resumo : neste tutorial, você aprenderá sobre namespaces C# e como usá-los para organizar o código.

Introdução aos namespaces C#

Os namespaces C# permitem agrupar classes , interfaces , structs, enums e delegados relacionados em uma única unidade lógica. Os namespaces também ajudam a evitar problemas de conflito de nomenclatura.

Para declarar um namespace, você usa a namespacepalavra-chave seguida pelo nome do namespace da seguinte forma:

namespace namespaceName
{
   // code elements
}Linguagem de código:  C#  ( cs )

Por exemplo, você pode criar o HR.csarquivo e definir um novo namespace chamado HR:

namespace HR
{
    // code elements
}Linguagem de código:  C#  ( cs )

Neste exemplo, HRé o nome do namespace. Dentro do HRnamespace, você pode definir tipos como classes e interfaces. Por exemplo:

namespace HR
{
    class Employee
    {
        public string Name
        {
            get; set;
        }
        public string JobTitle
        {
            get; set;
        }

        public override string ToString() => $"{Name} ({JobTitle})";
    }
}Linguagem de código:  C#  ( cs )

Todos os tipos que você define entre chaves do HRnamespace pertencerão ao HRnamespace.

A partir do C# 10, você pode simplificar a sintaxe do namespace removendo as chaves de abertura e fechamento assim:

namespace HR;

class Employee
{
    public string Name
    {
        get; set;
    }
    public string JobTitle
    {
        get; set;
    }

    public override string ToString() => $"{Name} ({JobTitle})";
}Linguagem de código:  C#  ( cs )

Ao fazer isso, todos os tipos que você definir no HR.csarquivo pertencerão ao HRnamespace.

Esta nova sintaxe parece mais limpa e economiza espaço horizontal. Também torna seu código mais fácil de ler.

Para usar a Employeeclasse dentro do Program.csarquivo, você pode referenciar o nome totalmente qualificado da classe assim:

var employee = new HR.Employee()
{
    Name = "John Doe",
    JobTitle = "C# Developer"
};

Console.WriteLine(employee);Linguagem de código:  C#  ( cs )

Normalmente, você usa a usinginstrução para fazer referência a uma classe em um namespace sem especificar o namespace completo dessa classe. Por exemplo:

using HR;

var employee = new Employee()
{
    Name = "John Doe",
    JobTitle = "C# Developer"
};

Console.WriteLine(employee);Linguagem de código:  C#  ( cs )

Neste exemplo, usamos a instrução using para importar explicitamente o HRnamespace e referenciar a Employeeclasse usando apenas o nome da classe.

Namespaces aninhados

Namespaces aninhados são namespaces definidos em outro namespace. Eles permitem organizar os elementos de código de forma mais granular, especialmente quando você trabalha com bases de código maiores.

Para definir namespaces aninhados em C#, basta declará-los dentro de outro namespace. Por exemplo:

namespace HR
{
    namespace Personnel
    {
        class Employee
        {
            public string Name
            {
                get; set;
            }
            public string JobTitle
            {
                get; set;
            }

            public override string ToString() => $"{Name} ({JobTitle})";
        }
    }
    namespace Payroll
    {
        class SalaryCalculator
        {
        }
    
    }
}Linguagem de código:  C#  ( cs )

Neste exemplo, definimos dois namespaces aninhados Personnele Payrolldentro do HRnamespace. O Personnelnamespace possui a Employeeclasse e o Payrollnamespace possui a SalaryCalculatorclasse.

Para fazer referência a um namespace aninhado, você usa a notação de ponto para indicar o relacionamento pai-filho entre os namespaces. Por exemplo:

using HR.Personnel;
using HR.Payroll;Linguagem de código:  C#  ( cs )

Neste exemplo, usamos a usinginstrução para importar os namespaces Personnele Payrolldo HRnamespace.

E você pode fazer referência aos tipos nesses namespaces aninhados sem os nomes totalmente qualificados:

using HR.Personnel;
using HR.Payroll;

var employee = new Employee()
{
    Name = "John Doe",
    JobTitle = "C# Developer"
};

Console.WriteLine(employee);

var salaryCalculator = new SalaryCalculator();Linguagem de código:  C#  ( cs )

Ao usar namespaces aninhados, é importante manter o nível de aninhamento em um nível razoável. Se você aninhar muito profundamente, seu código será mais difícil de entender e manter. É uma prática comum buscar um nível de aninhamento de no máximo 3 ou 4 níveis de profundidade.

Observe que quando você importa um namespace, ele não importa automaticamente o namespace aninhado. Por exemplo:

using HR;

var employee = new Employee() // ERROR
{
    Name = "John Doe",
    JobTitle = "C# Developer"
};

Console.WriteLine(employee);Linguagem de código:  C#  ( cs )

Neste exemplo, a HRinstrução using importa apenas os tipos no HRnamespace, mas os tipos no namespace aninhado. Portanto, isso resulta em um erro.

Para corrigir isso, você precisa importar o HRnamespace .Personnel ou fazer referência à Employeeclasse usando um nome totalmente qualificado.

Usando namespace C# para evitar conflitos de nomenclatura

Os namespaces podem ajudá-lo a evitar conflitos de nomenclatura. Por exemplo, você pode ter o mesmo nome de classe em namespaces diferentes.

Isso ocorre porque os namespaces atuam como um contêiner para elementos de código e quando você prefixa os elementos de código com namespaces, os elementos de código serão identificáveis ​​exclusivamente.

Por exemplo:

namespace HR
{
    namespace Dependents
    {
        class Person
        {
            public string Name
            {
                get; set;
            }
        }
    }

    namespace Personnel
    {
        class Person
        {
            public string Name
            {
                get; set;
            }
        }
        class Employee : Person
        {

            public string JobTitle
            {
                get; set;
            }
            public override string ToString() => $"{Name} ({JobTitle})";
        }
    }

}Linguagem de código:  C#  ( cs )

Neste exemplo, temos a mesma classe Person em namespaces diferentes Dependentse Personnel. Se você importar ambos HR.Personnelos HR.Dependentsnamespaces e para o mesmo arquivo, receberá um erro:

using HR.Personnel;
using HR.Dependents;

var child = new Person(); // ERRORLinguagem de código:  C#  ( cs )

A razão é que quando você faz referência à Personclasse, o compilador não conhece o namespace exato da Personclasse.

Para corrigir isso, você precisa usar um nome de classe totalmente qualificado e importar apenas o namespace que você usa com frequência no código. Por exemplo:

using HR.Dependents;

// comes from HR.Dependents
var child = new Person();

// comes from HR.Personnel
var father = new HR.Personnel.Employee(); Linguagem de código:  C#  ( cs )

Neste exemplo, a Personclasse refere-se à classe Person no HR.Dependentsnamespace. Para fazer referência à Employeeclasse no HR.Personnelnamespace, é necessário usar o nome completo da classe.

Práticas recomendadas de namespace C#

A seguir estão as práticas recomendadas quando se trata de usar namespaces em C#:

  • Use nomes de namespace significativos e descritivos.
  • Use namespaces aninhados para organizar ainda mais os elementos de código, mas evite usar namespaces aninhados que sejam muito profundos ou complexos.
  • Use diretivas com moderação e apenas para namespaces usados ​​com frequência.

Resumo

  • Use namespace e namespace aninhado para tornar seu código mais organizado, especialmente ao trabalhar com uma base de código grande.
  • Use namespaces para evitar conflitos de nomenclatura.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *