C#のスコープ解決演算子(::)とは?名前空間エイリアスの使い方を実例で解説
スコープ解決演算子(::)とは
C#におけるスコープ解決演算子「::」は、C++の同名の演算子とは役割が大きく異なります。C++では「::」はグローバル変数やクラスの静的メンバーへのアクセスに用いられますが、C#では主に名前空間エイリアスを修飾するために使用されます。
なぜスコープ解決演算子が必要なのか
異なる名前空間に同じ識別子を持つ型が存在する場合、どちらの型を参照したいのかを明示する必要があります。このようなときにスコープ解決演算子を使うことで、参照先の曖昧さを解消できます。
たとえば、標準の System.Console クラスを確実に参照したい場合は、global名前空間エイリアスと組み合わせて次のように記述します。
global::System.Console
「global::」を付けることで、プロジェクト内に「System」という名前の独自名前空間が存在しても、必ず.NET標準のSystem名前空間が参照されます。これにより、名前の衝突によるコンパイルエラーや意図しない動作を回避できます。
サンプルコード
以下の例では、usingディレクティブで名前空間エイリアス「myAlias」を定義し、「myAlias::Hashtable」のようにスコープ解決演算子を使ってHashtableクラスを参照しています。また、出力時には「global::System.Console」を使用して、標準のConsoleクラスを明示的に呼び出しています。
using myAlias = System.Collections;
namespace Program {
class Demo {
static void Main() {
myAlias::Hashtable h = new myAlias::Hashtable();
h.Add("Q", "1");
h.Add("R", "2");
h.Add("S", "3");
h.Add("T", "4");
h.Add("U", "5");
foreach (string n in h.Keys) {
global::System.Console.WriteLine(n + " " + h[n]);
}
}
}
}実行結果
T 4 R 2 S 3 U 5 Q 1
なお、Hashtableのキーの列挙順序は仕様上保証されていないため、実際の出力順序は実行環境によって異なる場合があります。キーを特定の順序で処理したい場合は、SortedDictionaryなど順序が保証されるコレクションの利用を検討してください。
まとめ
- C#の「::」は名前空間エイリアスの修飾に使われ、C++とは意味が異なる
- 「global::」を付けると、最上位(グローバル)名前空間から型が検索され、名前の衝突を回避できる
- usingエイリアスと組み合わせて「エイリアス名::型名」の形式で記述する
-
C#のArrayListクラスにおけるCapacityプロパティとは?使い方を解説
ArrayListクラスのCapacityプロパティは、そのArrayListが格納できる要素の数を取得または設定するためのプロパティです。Capacity(容量)は、実際に格納されている要素数を表すCount(カウント)よりも常に大きいか等しい値になります。Capacityプロパティへのアクセスは以下のように記述します。arrList.Capacity容量の仕組みArrayListの既定の容量は4です。要素を追加していき、既定の容量を超えると、容量は自動的に2倍に拡張されます。例えば、5つの要素を追加した場合、容量は8に拡張されます。以降も同様に、容量を超えた時点で順次2倍ずつ拡張されていき
-
Pythonの&=演算子とは?ビット演算とインプレース代入の仕組みを解説
&=演算子の正体:object.__iand__()メソッドPythonにおける &= 演算子は、object.__iand__() メソッドに対するシンタックスシュガー(糖衣構文)です。公式ドキュメントには以下のように記載されています。「これらのメソッドは、拡張代入演算子(+=、-=、*=、@=、/=、//=、%=、**=、<<=、>>=、&=、^=、|=)を実装するために呼び出されます。これらのメソッドは、可能な限りインプレース(self自身を直接変更する形)で操作を行い、その結果を返すことが求められます(返り値はselfである必要はありませ