Использование пространств имен (Руководство по программированию в C#)

В программах на языке C# пространства имен активно используются двумя способами.Во-первых, классами платформы .NET Framework пространства имен используются для организации большого числа классов.Во-вторых, объявление собственного пространства имен поможет в управлении областью действия имен классов и методов в крупных программных проектах.

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

Большинство приложений на языке C# начинаются с раздела директив using.В этом разделе перечисляются пространства имен, которые будут часто использоваться приложением, и это спасает программиста от необходимости указывать полное имя каждый раз, когда используется содержащийся в них метод.

Например, включив строку:

using System;

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

Console.WriteLine("Hello, World!");

вместо кода:

System.Console.WriteLine("Hello, World!");

Псевдонимы пространств имен

Директива using (Справочник по C#) также может использоваться для создания псевдонима пространства имен.Например, в случае использования написанного прежде пространства имен, содержащего вложенные пространства имен, можно объявить псевдоним для обеспечения быстрого способа обращения к одному из них, как показано в следующем примере:

using Co = Company.Proj.Nested;  // define an alias to represent a namespace

Использование пространств имен для управления областью действия

Ключевое слово namespace используется для объявления области действия.Возможность создавать области действия в рамках проекта помогает организовывать код и позволяет создавать глобально уникальные типы.В следующем примере в двух пространствах имен, одно из которых вложено в другое, определяется класс, названный SampleClass.Для того, чтобы различать, какой метод вызывается, используется . Оператор (справочник по C#).

namespace SampleNamespace
{
    class SampleClass
    {
        public void SampleMethod()
        {
            System.Console.WriteLine(
              "SampleMethod inside SampleNamespace");
        }
    }

    // Create a nested namespace, and define another class.
    namespace NestedNamespace
    {
        class SampleClass
        {
            public void SampleMethod()
            {
                System.Console.WriteLine(
                  "SampleMethod inside NestedNamespace");
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Displays "SampleMethod inside SampleNamespace."
            SampleClass outer = new SampleClass();
            outer.SampleMethod();

            // Displays "SampleMethod inside SampleNamespace."
            SampleNamespace.SampleClass outer2 = new SampleNamespace.SampleClass();
            outer2.SampleMethod();

            // Displays "SampleMethod inside NestedNamespace."
            NestedNamespace.SampleClass inner = new NestedNamespace.SampleClass();
            inner.SampleMethod();
        }
    }
}

Полные имена

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

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

namespace N1     // N1
{
    class C1      // N1.C1
    {
        class C2   // N1.C1.C2
        {
        }
    }
    namespace N2  // N1.N2
    {
        class C2   // N1.N2.C2
        {
        }
    }
}

В предыдущем фрагменте кода:

  • пространство имен N1 является членом глобального пространства имен.Его полным именем является N1;

  • пространство имен N2 является членом пространства имен N1.Его полным именем является N1.N2;

  • класс C1 является членом пространства имен N1.Его полным именем является N1.C1;

  • имя класса C2 используется в этом коде два раза.Однако полные имена являются уникальными.Первый экземпляр класса C2 объявлен внутри класса C1; следовательно, его полным именем является N1.C1.C2.Второй экземпляр класса C2 объявлен внутри пространства имен N2; следовательно, его полным именем является N1.N2.C2.

Используя предыдущий фрагмента кода, можно добавить новый член: класс C3, в пространство имен N1.N2, как показано ниже:

namespace N1.N2
{
    class C3   // N1.N2.C3
    {
    }
}

В общем, используйте ключевое слово :: для обращения к псевдониму пространства имен или ключевое слово global:: для обращения к глобальному пространству имен и ключевое слово . для уточнения типов или членов.

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

using Alias = System.Console;
class TestClass
{
    static void Main()
    {
        // Error
        //Alias::WriteLine("Hi");

        // OK
        Alias.WriteLine("Hi");
    }
}

Обратите внимание, что ключевое слово global не является предопределенным псевдонимом. Следовательно, имя global.X не имеет какого-либо специального значения.Оно приобретает специальное значение только при использовании с ключевым словом ::.

В случае определения псевдонима global создается предупреждение компилятора CS0440, поскольку ключевое слово global:: всегда ссылается на глобальное пространство имен, а не на псевдоним.Например, следующая строка приведет к генерированию предупреждения:

using global = System.Collections;   // Warning

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

using Alias = System;
namespace Library
{
    public class C : Alias.Exception { }
}

Этот код работает, но если в последующем будет введен тип Alias, то конструкция Alias. станет связана с этим типом.Использование конструкции Alias::Exception гарантирует, что имя Alias будет обрабатываться как псевдоним пространства имен и не будет ошибочно принято за тип.

Дополнительные сведения о псевдониме global см. в разделе Практическое руководство. Использование псевдонима глобального пространства имен (Руководство по программированию на C#).

См. также

Ссылки

Пространства имен (Руководство по программированию в C#)

Ключевые слова, используемые для пространств имен (справочник по C#)

. Оператор (справочник по C#)

Оператор :: (Справочник по C#)

extern (справочник по C#)

Основные понятия

Руководство по программированию на C#