Обычно определяемые классы и другие типы в .NET не существуют сами по себе, а заключаются в специальные контейнеры - пространства имен. Пространства имен позволяют организовать код программы в логические блоки, поволяют объединить и отделить от остального кода некоторую функциональность, которая связана некоторой общей идеей или которая выполняет определенную задачу.
Для определения пространства имен применяется ключевое слово namespace, после которого идет название название пространства имен:
namespace имя_пространства_имен { // содержимое пространства имен }
Например, определим в файле Program.cs пространство имен, которое будет называться Base
namespace Base { class Person { string name; public Person(string name) => this.name = name; public void Print() => Console.WriteLine($"Имя: {name}"); } }
Здесь пространство имен содержит класс Person, которой имеет одну переменную - name, конструктор и метод Print.
Теперь попробуем использовать класс Person:
Person tom = new Person("Tom"); // Ошибка - Visual Studio не видит класс Person tom.Print(); namespace Base { class Person { string name; public Person(string name) => this.name = name; public void Print() => Console.WriteLine($"Имя: {name}"); } }
Здесь на первой строке мы столкнемся с ошибкой, так как Visual Studio не может найти класс Person. Чтобы все-таки обратиться к классу Person, необходимо использовать полное имя этого класса с учетом пространства имен:
Base.Person tom = new("Tom"); tom.Print(); // Имя: Tom namespace Base { class Person { string name; public Person(string name) => this.name = name; public void Print() => Console.WriteLine($"Имя: {name}"); } }
Поскольку класс Person располагается в пространстве имен Base, то его полное имя - Base.Person. Соответственно, используя это имя, мы можем обращаться к данному классу вне его пространства имен.
Однако полное имя класса с учетом пространства имен добавляет в код избыточность - особенно, если пространство имен содержит множество классов, которые мы хотим использовать. И чтобы не писать полное имя класса, мы можем просто подключить пространство имен с помощью директивы using:
using Base; // подключение пространства имен Base Person tom = new("Tom"); tom.Print(); // Имя: Tom namespace Base { class Person { string name; public Person(string name) => this.name = name; public void Print() => Console.WriteLine($"Имя: {name}"); } }
Одни пространства имен могут содержать другие. Например:
namespace Base { namespace PersonTypes { class Person { string name; OrganisationTypes.Company company; public Person(string name, OrganisationTypes.Company company) { this.name = name; this.company = company; } public void Print() { Console.WriteLine($"Имя: {name} "); company.Print(); } } } namespace OrganisationTypes { class Company { string title; public Company(string title) => this.title = title; public void Print() => Console.WriteLine($"Название компании: {title}"); } } }
В данном случае классы Person и Company находятся в разных вложенных пространствах имен, поэтому чтобы в классе Person использовать класс Company, надо прописывать имя класса с учетом его пространства имен:
OrganisationTypes.Company
(так как оба класса в итоге находятся в общем пространстве - Base, то его имя можно не указывать в названии класса) или подключать пространство имен класса Company с помощью директивы using
.
Для обращения к этим классам вне пространства Base необходимо использовать всю цепочку пространств имен:
using Base.PersonTypes; // подключение пространства имен Base.PersonTypes для класса Person Base.OrganisationTypes.Company microsoft = new("Microsoft"); Person tom = new("Tom", microsoft); tom.Print(); // Имя: Tom Название компании: Microsoft namespace Base { namespace PersonTypes { class Person { string name; OrganisationTypes.Company company; public Person(string name, OrganisationTypes.Company company) { this.name = name; this.company = company; } public void Print() { Console.WriteLine($"Имя: {name} "); company.Print(); } } } namespace OrganisationTypes { class Company { string title; public Company(string title) => this.title = title; public void Print() => Console.WriteLine($"Название компании: {title}"); } } }
Начиная с .NET 6 и C# 10 можно определять пространства имен на уровне файла. Например, добавим в проект новый файл с кодом c#. Для этого в Visual Studio нажмем на название проекта правой кнопкой мыши и в появившемся меню выберем пункт Add -> New Item...
В окне добавления нового элемента выберем пункт Class и поле Name в качестве имени файла укажем Base.cs
После этого в проект будет добавлен файл Base.cs. Удалим из него все содержимое по умолчанию и определим в нем следующий код:
namespace Base; class Person { string name; public Person(string name) => this.name = name; public void Print() => Console.WriteLine($"Имя: {name} "); }
Директива namespace Base
в начале файла указывает, что содержимое файла будет представлять пространство имен Base.
Теперь подключим это пространство имен в файле Program.cs:
using Base; // подключение пространства имен Base Person tom = new("Tom"); tom.Print();