День двухсотый. #ЗаметкиНаПолях

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

Псевдонимы пространств имён используются, когда вам нужно обратиться к типам с одинаковым именем из разных пространств имён. Следующий пример показывает, как один метод может обратиться к классам Button из Windows Forms и ASP.NET Web Forms.

using System;

using WinForms = System.Windows.Forms;

using WebForms = System.Web.UI.WebControls;

class Test

{

static void Main()

{

Console.WriteLine(typeof(WinForms.Button));

Console.WriteLine(typeof(WebForms.Button));

}

}

Это хорошо работает до тех пор, пока не появляется пространство имён с именем WinForms. Чтобы различать названия пространств имён и их псевдонимы в C#2 введены квалификаторы псевдонимов пространств имён, представляющие из себя просто пару двоеточий. Таким образом, код выше можно переписать так:

static void Main()

{

Console.WriteLine(typeof(WinForms::Button));

Console.WriteLine(typeof(WebForms::Button));

}



Псевдоним глобального пространства имён

Несмотря на то, что типы крайне редко объявляются в глобальном пространстве имён, его можно использовать как «корневое» пространство имён. В C#2 введён псевдоним global, обозначающий глобальное пространство имён. Например, при использовании типа DateTime, если он объявлен во нескольких пространствах имён, то обратиться к системному типу можно, использовав следующую конструкцию global::System.DateTime. Использовать псевдоним глобального пространства имён полезно, например, при написании автоматических генераторов кода, когда есть большая вероятность коллизий сгенерированных названий пространств имён и типов.



Внешние псевдонимы

В крайнем случае, когда два типа с одинаковыми именами находятся в пространствах имен с одинаковыми именами, но предоставлены в разных сборках, можно воспользоваться внешними псевдонимами, используя ключевые слова extern alias:

extern alias GridV1;

extern alias GridV2;



using GridV1::Grid;

using GridV2::Grid;

Связать файл сборки с именем внешнего псевдонима можно либо в файле конфигурации, либо указав параметр /r компилятору в командной строке:

/r:GridV1=grid.dll

/r:GridV2=grid20.dll



Источник: Jon Skeet “C# In Depth”. 4th ed – Manning Publications Co, 2019. Глава 2.