Использование пространств имен (Руководство по программированию в 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#)