Пространства имен

Последнее обновление: 10.11.2021

Обычно определяемые классы и другие типы в .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.

пространства имен в языке программирования C# и .NET

Теперь попробуем использовать класс 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}");
    }
}
подключение пространства имен и using в языке программирования C# и .NET

Вложенные пространства имен

Одни пространства имен могут содержать другие. Например:

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...

добавление нового пространства имен C# в Visual Studio

В окне добавления нового элемента выберем пункт Class и поле Name в качестве имени файла укажем Base.cs

пространства имен уровня файла C# в Visual Studio

После этого в проект будет добавлен файл 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();
Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850