Использование пространств имен для управления областью действия
Ключевое слово namespace используется для объявления области действия. Возможность создавать области действия в рамках проекта помогает организовывать код и позволяет создавать глобально уникальные типы. В следующем примере в двух пространствах имен, одно из которых вложено в другое, определяется класс, названный SampleClass. Для того, чтобы различать, какой метод вызывается, используется . оператор.
ß-----
Fully Qualified Names
Namespaces and types have unique titles described by fully qualified names that indicate a logical hierarchy. 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:
· The namespace N1 is a member of the global namespace. Its fully qualified name is N1.
· The namespace N2 is a member of N1. Its fully qualified name is N1.N2.
· The class C1 is a member of N1. Its fully qualified name is N1.C1.
· The class name C2 is used two times in this code. However, the fully qualified names are unique. The first instance of C2 is declared inside C1; therefore, its fully qualified name is: N1.C1.C2. The second instance of C2 is declared inside a namespace N2; therefore, its fully qualified name is N1.N2.C2.
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 { } } |
Полные имена
Пространства имен и типы имеют уникальные названия, описываемые полными именами, показывающими логическую иерархию. Например, инструкция A.B подразумевает, что A — это имя пространства имен или типа, а B — это вложенный в него тип.
|
|
В следующем примере показаны вложенные классы и пространства имен. Полное имя указано в качестве примечания после каждой сущности.
ß---
В предыдущем фрагменте кода:
· пространство имен 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 { } } |
In general, use :: 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"); } } |
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 ::.
|
|
A warning (see Compiler Warning (level 2) 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 { } } |
This works, but if a type named Alias were to subsequently be introduced, Alias. would bind to that type instead. Using Alias::Exception insures that Alias is treated as a namespace alias and not mistaken for a type.
В общем, используйте ключевое слово :: для обращения к псевдониму пространства имен или ключевое слово global:: для обращения к глобальному пространству имен и ключевое слово . для уточнения типов или членов.
Ошибкой является использование ключевого слова :: с псевдонимом, ссылающимся на тип, а не на пространство имен. Например:
ß---
Обратите внимание, что ключевое слово global не является предопределенным псевдонимом. Следовательно, имя global.X не имеет какого-либо специального значения. Оно приобретает специальное значение только при использовании с ::.
В случае определения псевдонима global генерируется предупреждение (см. раздел Предупреждение компилятора (уровень 2) CS0440), потому что ключевое слово global:: всегда ссылается на глобальное пространство имен, а не на псевдоним. Например, следующая строка приведет к генерированию предупреждения:
|
|
using global = System.Collections; // Warning |
Использование ключевого слова :: с псевдонимами является правильной методикой, защищающей от неожиданного введения дополнительных типов. Рассмотрим, например, следующий фрагмент кода:
using Alias = System; |
namespace Library { public class C : Alias.Exception { } } |
Этот код работает, но если в последующем будет введен тип Alias, то конструкция Alias. станет связана с этим типом. Использование конструкции Alias::Exception гарантирует, что имя Alias будет обрабатываться как псевдоним пространства имен и не будет ошибочно принято за тип.
Дата добавления: 2019-03-09; просмотров: 205; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!