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

В этом руководстве вы узнаете о пространствах имен, о том, как их определять, как получать доступ к их членам и использовать в программах на C#.

Пространства имен в C# определяет область кода, в которой гарантируется уникальность всех идентификаторов. Это своеобразные контейнеры, в которых находятся другие пространства имен, классы и т. д.

Пространство имен может включать следующие типы данных:

  1. другие пространства имен;
  2. классы;
  3. интерфейсы;
  4. структуры; 
  5. делегаты.

Мы обсудим эти темы в следующих уроках. Пока поговорим только о классах и пространствах имен.

Пространства имен — необязательная часть программы на C#. Они нужны, чтобы управлять крупными проектами и писать чистый код.

Давайте разберемся с концепцией пространства имен на примере из реальной жизни. У вас на компьютере, скорее всего, куча файлов и папок. Представьте, как бы сложно было ими управлять, если бы они все лежали в одном каталоге. Вот почему мы помещаем связанные файлы и папки в отдельные каталоги. Это упрощает работу с данными.

Так же и с пространствами имен: они помогают нам организовывать разные члены, если мы поместим их в одно и то же пространства.

Пространство имен еще и решает проблему конфликта имен. Он возникает, когда два одинаковых идентификатора находятся в одной области видимости, и компилятор не может понять, какой из этих двух следует использовать в конкретной ситуации.

Определяем пространства имен

В C# определить пространство имен можно с помощью ключевого слова namespace.

namespace имя_пространства_имен
{
  // Тело пространства имен
}
Например:
namespace MyNamespace
{
    class MyClass
    {
        public void MyMethod()
        {
            System.Console.WriteLine("Создаем пространство имен");
		}
	}
}

В приведенном выше примере мы создали пространство имен с именем MyNamespace. Оно состоит из класса MyClass. MyMethod в свою очередь — метод класса MyClass.

Доступ к членам пространства имен

Доступ к членам пространства имен можно получить с помощью оператора .. Вот, как это делается:

Имя_пространства_имен.Имя_члена

Например, если нам нужно создать объект класса MyClass, это можно сделать вот так:

MyNamespace.MyClass myClass = new MyNamespace.MyClass();

Мы обсудим создание объектов в следующих уроках. А пока просто постарайтесь понять, как мы получаем доступ к классу MyClass.

Пример 1. Объявляем пространство имен

using System;

namespace MyNamespace
{
    public class SampleClass
    {
        public static void myMethod()
        {
            Console.WriteLine("Создаем пространство имен");
        }
    }
}
 
namespace MyProgram
{
    public class MyClass
    {
        public static void Main()
        {
            MyNamespace.SampleClass.myMethod();
        }
    }
}

Вывод:

Создаем пространство имен

В приведенной выше программе мы создали пространство имен MyNamespace и получили доступ к его членам из метода Main() класса MyClass. Как было сказано ранее, оператор . используется для доступа к членам пространства имен.

В методе Main() метод myMethod() вызывается с помощью оператора ..

Ключевое слово using

Пространство имен можно включить в программу с помощью ключевого слова using. Вот, как это делается:

using Namespace-Name;
Например:
using System

Преимущество такого подхода заключается в том, что нам не нужно указывать полное имя члена пространства имен каждый раз, когда мы обращаемся к нему.

Если в начале программы мы написали

using System

дальше спокойно можно писать

Console.WriteLine ("Привет, мир!");

вместо полного имени

System.Console.WriteLine ("Привет, мир!");

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

Внутри одного пространства имен может содержаться другое пространство имен. Это называется вложенным пространством имен. Доступ к вложенному пространству имен и его членам получается точно так же, с помощью оператора ..

Синтаксис

namespace Имя_пространства_имен
{
  namespace Имя_вложенного_пространства_имен
  {
      // Тело вложенного пространства имен
}
}

Пример 2. Работаем с вложенным пространством имен

using System;
 
// Вложенное пространство имен
namespace MyNamespace
{
    namespace Nested
    {
        public class SampleClass
        {
            public static void myMethod()
            {
                Console.WriteLine("Пример вложенного пространства имен");
            }
        }
    }
}
 
namespace MyProgram
{
    public class MyClass
    {
        public static void Main()
        {
            MyNamespace.Nested.SampleClass.myMethod();
        }
    }
}

Вывод:

Пример вложенного пространства имен
Проверьте себя
1. Для чего используются пространства имён в C#?
AДля организации кода и предотвращения конфликтов имён
BДля ускорения компиляции
CДля объявления переменных
DДля автоматической генерации документации
2. Как обратиться к классу `SampleClass` внутри пространства имён `MyNamespace` без директивы `using`?
AMyNamespace.SampleClass
BSampleClass.MyNamespace
CMyNamespace->SampleClass
Dimport MyNamespace.SampleClass
3. Что даёт директива `using System;` в начале файла?
AПодключает внешнюю библиотеку System.dll
BОбъявляет пространство имён текущего файла
CПозволяет использовать члены пространства имён System без полного квалифицированного имени
DЗапрещает использование других пространств имён
4. Может ли одно пространство имён содержать другое пространство имён?
AНет, пространства имён не могут быть вложенными
BДа, но только если внешнее пространство имён пустое
CНет, все пространства имён должны быть на одном уровне
DДа, это называется вложенным пространством имён