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

Пространства имен часто используются в программировании на C# двумя способами.Namespaces are heavily used within C# programs in two ways. Первый способ — для упорядочения классов .NET используются пространства имен.Firstly, the .NET classes use namespaces to organize its many classes. Второй способ — объявление собственных пространств имен поможет вам контролировать область имен классов и методов в более крупных проектах.Secondly, declaring your own namespaces can help control the scope of class and method names in larger programming projects.

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

Большинство приложений на языке C# начинается с раздела директив using.Most C# applications begin with a section of using directives. В этом разделе перечисляются пространства имен, которые будут часто использоваться приложением, благодаря чему программист может не указывать их полные названия каждый раз, когда вызывается содержащийся в них метод.This section lists the namespaces that the application will be using frequently, and saves the programmer from specifying a fully qualified name every time that a method that is contained within is used.

Например, включив строкуFor example, by including the line:

using System;

в начале программы, программист может использовать кодAt the start of a program, the programmer can use the code:

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

вместо следующего кода:Instead of:

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

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

Можно также использовать директиву using для создания псевдонимов пространства имен.You can also use the using directive to create an alias for a namespace. Используйте квалификатор псевдонима пространства имен :: для доступа к членам пространства имен, обозначенного псевдонимом.Use the namespace alias qualifier :: to access the members of the aliased namespace. В следующем примере показано, как создать и использовать псевдоним для пространства имен.The following example shows how to create and use a namespace alias:

using generics = System.Collections.Generic;

namespace AliasExample
{
    class TestClass
    {
        static void Main()
        {
            generics::Dictionary<string, int> dict = new generics::Dictionary<string, int>()
            {
                ["A"] = 1,
                ["B"] = 2,
                ["C"] = 3
            };

            foreach (string name in dict.Keys)
            {
                System.Console.WriteLine($"{name} {dict[name]}");
            }
            // Output:
            // A 1
            // B 2
            // C 3
        }
    }
}

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

Область действия объявляется с помощью ключевого слова namespace.The namespace keyword is used to declare a scope. Определяя области действия в проекте, вы можете упорядочивать код и создавать уникальные на глобальном уровне типы.The ability to create scopes within your project helps organize code and lets you create globally-unique types. В следующем примере класс SampleClass определяется в двух пространствах имен, одно из которых вложено в другое.In the following example, a class titled SampleClass is defined in two namespaces, one nested inside the other. Для определения конкретного вызываемого метода используется маркер ..The . token is used to differentiate which method gets called.

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();
        }
    }
}

Полные именаFully qualified names

Пространства имен и типы имеют уникальные названия, которые описываются полными именами, определяющими их место в логической иерархии.Namespaces and types have unique titles described by fully qualified names that indicate a logical hierarchy. Например, инструкция A.B указывает, что A — это пространство имен или тип, а B — вложенный в него элемент.For example, the statement A.B implies that A is the name of the namespace or type, and B is nested inside it.

В следующем примере показаны вложенные классы и пространства имен.In the following example, there are nested classes and namespaces. Полное имя каждого элемента указано в комментарии рядом с ним.The fully qualified name is indicated as a comment following each entity.

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

В предыдущем фрагменте кода:In the previous code segment:

  • Пространство имен N1 является членом глобального пространства имен.The namespace N1 is a member of the global namespace. Его полное имя: N1.Its fully qualified name is N1.

  • Пространство имен N2 является членом пространства имен N1.The namespace N2 is a member of N1. Его полное имя: N1.N2.Its fully qualified name is N1.N2.

  • Класс C1 является членом пространства имен N1.The class C1 is a member of N1. Его полное имя: N1.C1.Its fully qualified name is N1.C1.

  • В этом коде имя класса C2 используется два раза.The class name C2 is used two times in this code. Тем не менее полные имена являются уникальными.However, the fully qualified names are unique. Первый экземпляр C2 объявляется в классе C1. Соответственно, его полное имя: N1.C1.C2.The first instance of C2 is declared inside C1; therefore, its fully qualified name is: N1.C1.C2. Второй экземпляр C2 объявляется в пространстве имен N2. Соответственно, его полное имя: N1.N2.C2.The second instance of C2 is declared inside a namespace N2; therefore, its fully qualified name is N1.N2.C2.

Используя представленный выше фрагмент кода, вы можете добавить новый элемент класса C3 в пространство имен N1.N2, как показано выше:Using the previous code segment, you can add a new class member, C3, to the namespace N1.N2 as follows:

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

В общем случае следует использовать квалификатор псевдонима пространства имен :: для ссылки на псевдоним пространства имен или global:: для ссылки на глобальное пространство имен, а также . для определения типов или элементов.In general, use the namespace alias qualifier :: to reference a namespace alias or global:: to reference the global namespace and . to qualify types or members.

Использование :: с псевдонимом, ссылающимся на тип вместо пространства имен, будет ошибкой.It is an error to use :: with an alias that references a type instead of a namespace. Пример:For example:

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

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

Помните, что слово global не является предопределенным псевдонимом и, соответственно, выражение global.X не имеет какого-либо конкретного значения.Remember that the word global is not a predefined alias; therefore, global.X does not have any special meaning. Конкретное значение будет получено только при его использовании вместе с ::.It acquires a special meaning only when it is used with ::.

Если определить псевдоним с именем global, возникнет предупреждение компилятора CS0440. Это связано с тем, что global:: всегда ссылается на глобальное пространство имен, а не на псевдоним.Compiler warning CS0440 is generated if you define an alias named global because global:: always references the global namespace and not an alias. Например, предупреждение возникнет в следующем случае:For example, the following line generates the warning:

using global = System.Collections;   // Warning

При работе с псевдонимами рекомендуется использовать ::, поскольку это обеспечивает защиту от случайного определения дополнительных типов.Using :: with aliases is a good idea and protects against the unexpected introduction of additional types. Рассмотрим следующий пример:For example, consider this example:

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

Этот код будет работать, однако если впоследствии определить тип с именем Alias, выражение Alias. будет связываться с этим типом.This works, but if a type named Alias were to subsequently be introduced, Alias. would bind to that type instead. Используя выражение Alias::Exception, вы гарантируете, что Alias будет обрабатываться как псевдоним пространства имен и не будет ошибочно связываться с типом.Using Alias::Exception ensures that Alias is treated as a namespace alias and not mistaken for a type.

См. такжеSee also