2012年10月31日水曜日

名前空間(namespace)に関する疑問

C#の名前空間で、気になっていたことを調べたので、その記録。


C#って「グローバル名前空間」ってあるのか?

どうやらC#にも「グローバル名前空間」はあるみたい。
C++を勉強したときに「名前空間」はグローバルスコープを分けるものだと理解しているので、C#でも「グローバル名前空間」があるのは当たり前か。


C#にもグローバル名前空間があるってことは、「グローバル名前空間で変数を宣言できるのか?

調べてみたら、C#の名前空間で宣言できる型は次の6つ。
  • 名前空間
  • class
  • interface
  • struct
  • enum
  • delegate
「名前空間」は型とは言えないだろうけど、含めてます。
詳しくは、MSDNの「namespace (C# リファレンス)」を参照してください。
(こちらにも、似たようなことが書かれていました「C# プログラムの一般構造」)

ちなみに、名前空間で変数を宣言すると、コンパイラに怒られます!


グローバル名前空間から指定するには “global::”を使います。
“::”は「名前空間エイリアス修飾子」といいます。

System.Console.WriteLineメソッドをグローバル名前空間から指定すると次のようになる。


これを実行すると、こんな感じ。


普通に「System.Console.WriteLineメソッド」が呼ばれます。
この例では、何のために「global::」を使うのかが分かりづらいとおもいますが、グローバル名前空間の指定は「曖昧さの解決(名前解決)」に使うためのものだと思います。おそらく、あまり使う機会はなさそうです。

最後に「グローバル名前空間」について参考になったページを紹介。

これすごく分かりやすい。
↓ ↓ ↓