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 namespace
palavra-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.cs
arquivo e definir um novo namespace chamado
:HR
namespace HR
{
// code elements
}
Linguagem de código: C# ( cs )
Neste exemplo,
é o nome do namespace. Dentro do HR
namespace, você pode definir tipos como classes e interfaces. Por exemplo:HR
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
namespace pertencerão ao HR
namespace.HR
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.cs
arquivo pertencerão ao
namespace.HR
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 Employee
classe dentro do Program.cs
arquivo, 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 using
instruçã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 HR
namespace e referenciar a Employee
classe 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 Personnel
e Payroll
dentro do HR
namespace. O Personnel
namespace possui a Employee
classe e o Payroll
namespace possui a SalaryCalculator
classe.
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 using
instrução para importar os namespaces Personnel
e Payroll
do HR
namespace.
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
instrução using importa apenas os tipos no HR
namespace, mas os tipos no namespace aninhado. Portanto, isso resulta em um erro.HR
Para corrigir isso, você precisa importar o HR
namespace .Personnel ou fazer referência à Employee
classe 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 Dependents
e Personnel
. Se você importar ambos HR.Personnel
os HR.Dependents
namespaces e para o mesmo arquivo, receberá um erro:
using HR.Personnel;
using HR.Dependents;
var child = new Person(); // ERROR
Linguagem de código: C# ( cs )
A razão é que quando você faz referência à Person
classe, o compilador não conhece o namespace exato da Person
classe.
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 Person
classe refere-se à classe Person no HR.Dependents
namespace. Para fazer referência à Employee
classe no HR.Personnel
namespace, é 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.