【C#】エイリアスがクラス名や名前空間と同名の場合に区別する方法

エイリアスがクラス名や名前空間と同名の場合に区別する方法

はじめに

C# ではusing ディレクティブを使用することで、名前空間の指定が省略可能になります。
以下コード内で使用している List<int> は、本来使用する際に System.Collections.Generic.List<int>と記述する必要がありますが、usingで定義しているため省略可能です。

using System.Collections.Generic;

public class SampleClass
{
	void Start()
	{
		var list = new List<int>();
		// var list = new System.Collections.Generic.List<int>();
	}
}

using の用途はこれだけでなく、エイリアスを定義するのにも使われます。

エイリアスとは?

C# でのエイリアスとは、クラスや名前空間に別名を付けられる修飾子のことです。

using でエイリアスを定義することで、クラスや名前空間を別名に置き換えることができます。

以下コード内ではusing を使い、名前空間である MyNameSpace.Common.UICommonUI として定義しています。その結果 SampleClass内で TestUIクラスの Draw() を呼びだしたい時はCommonUI.TestUI.Draw();と省略して記載できます。

using CommonUI = MyNameSpace.Common.UI;

namespace MyNameSpace.Common.UI
{
	public static class TestUI
	{
		public static void Draw()
		{
			// 省略
		}
	}
}

public class SampleClass
{
	void Start()
	{
		CommonUI.TestUI.Draw();
	}
}

エイリアス修飾子(::)」で同名を区別する

クラス名や名前空間とエイリアス名が同名の場合、コード側ではどちらを優先していいか分からずエラーになります。

その際、エイリアス修飾子 ::を使うことによりエラーが解決できます。エイリアス修飾子 ::を使用したコードはエイリアスの方を参照します

以下のコード内ではエイリアスとして「S」を定義し、クラス名にも「S」がある状態です。S::と記載することでエイリアスの「S」の方が参照されるようになります。

using S = System;

public class S {}

public class Sample
{
	public static void Main(string[] args)
	{
		S::Console.WriteLine("Test"); // エイリアスの「S」を参照
	}
}

global エイリアス」で同名を区別する

global エイリアスを使うことで、グローバル名前空間から参照することを強制します。

グローバル名前空間とは最上位の名前空間のことです。例えば、名前空間を定義しないSample クラスはグローバル名前空間に属することになります。

// グローバル名前空間内のクラス
public class MyClass { }

先程紹介したエイリアス修飾子 ::はエイリアスの方を参照しましたが、global エイリアスを使えばクラス名を参照することができます。記載する際は global::と書いて使用します。

using S = System;

public class S {}

public class Sample
{
	public static void Main(string[] args)
	{
		var s = new global::S(); // クラス名の「S」を参照
	}
}

参考資料