Содержание
Пространство имен — это область, в пределах которой названия типов должны быть уникальны. Обычно типы организуются в иерархические пространства имен с целью избежать конфликта названий и чтобы названия типов было легко найти. Пространство имен — неотъемлемая часть названия типа.
1 2 | System.Security.Cryptography.RSA rsa = System.Security.Cryptography.RSA.Create(); |
Пространства имен никак не зависят от сборок и от модификаторов доступа (public, internal, private и т.д.).
Ключевое слово namespace
задает пространство имен для всех типов в следующем после ключевого слова блоке:
1 2 3 4 5 | namespace Outer.Middle.Inner { class Class1 {} class Class2 {} } |
Точки в пространстве имен используются для обозначения иерархии вложенных пространств имен. Ссылаться на тип следует используя его полное уточненное (квалифицированное ) имя (fully qualified name), которое включает все пространства имен от внешнего до внутреннего.
Типы, не включенные ни в одно пространство имен, считаются расположенными в глобальном пространстве имен (global namespace). Глобальное пространство имен также включает пространства имен верхнего уровня.
Директива using
Директива using
импортирует пространство имен и делает возможным ссылаться на типы без использования их полных уточненных имен.
1 2 3 4 5 6 7 8 9 10 | using Outer.Middle.Inner; class Test // Класс Test расположен в глобальном пространстве имен { static void Main() { Class1 c; // Можно сослаться на класс без использования полного имени ... } } |
Директива using
может быть вложена в пространство имен, что ограничит область ее видимости.
Область видимости имен
Имена (названия типов) объявленные во внешнем пространстве имен могут использоваться во внутреннем пространстве без указания полного уточненного имени.
1 2 3 4 5 6 7 8 9 | namespace Outer { class Class1 {} namespace Inner { class Class2 : Class1 {} } } |
Если необходимо сослаться на другую ветвь в иерархии пространств имен, нужно использовать частично уточненное имя (partially qualified name).
1 2 3 4 5 6 7 8 9 10 11 12 | namespace MyTradingCompany { namespace Common { class ReportBase {} } namespace ManagementReporting { class SalesReport : Common.ReportBase {} // Частично уточненное имя } } |
Сокрытие имен
Если внутреннее и внешнее пространства имен содержат объявление типов с одинаковыми именами, то при использовании во внутреннем пространстве имен предпочтение будет отдано внутреннему типу. Чтобы сослаться на тип из внешнего пространства, необходимо использовать полное уточненное имя.
Повторение пространств имен
Объявление пространств имен могут повторяться, но имена типов, объявленных внутри них, не должны конфликтовать.
1 2 3 4 5 6 7 8 9 | namespace Outer.Middle.Inner { class Class1 {} } namespace Outer.Middle.Inner { class Class2 {} } |
Приставка global::
Иногда полные уточненные имена могут конфликтовать с внутренними именами. В этом случае, чтобы сослаться на тип с полным уточненным именем, нужно использовать приставку global::
.
1 | global::System.Text.StringBuilder sb; |
Псевдонимы типов и пространств имен
Импортирование пространств имен может привести к противоречию названий типов. Поэтому вместо импортирования пространства имен полностью, можно импортировать отдельные содержащиеся в нем типы, присвоив им псевдонимы.
1 2 3 4 5 6 | using PropertyInfo2 = System.Reflection.PropertyInfo; class Program { PropertyInfo2 p; } |
1 2 3 4 5 6 | using R = System.Reflection; class Program { R.PropertyInfo p; } |