C_Sharp-名前空間
名前空間(ネームスペース)について
名前空間とは
名前空間とは、変数名や関数名などの名前衝突を回避するために導入されたスコープ定義の機能です。
オブジェクト指向の大規模な開発はクラス名などの名前定義の衝突が発生しがちとなりますが、名前空間を使用すると効果的な管理ができるようになります。
名前空間は、1つのグローバルスコープを複数のスコープに分割する機能といえます。
グルーバルスコープについて
名前空間に囲まれていない部分は「グローバルスコープ」といいます。
グローバルスコープにクラスなどを定義することは可能ですが、名前の衝突を招きやすくなるため、推奨されません。
名前空間の定義
名前空間は、「namespace」宣言子と、「{ }(ブロック)」によって表現します。
namespace NAME{
// NAMEスコープの定義
}
名前空間の指定
名前空間を指定してクラスやメソッドを呼び出す場合「名前空間名.クラス名」と記述します。
namespace scope
{
class ScopeClass
{
public int num = 67890;
}
}
class Program
{
class ScopeClass
{
public int num = 12345;
}
static void Main()
{
ScopeClass obj1 = new ScopeClass();
System.Console.WriteLine(obj1.num);
// scope名前空間側のクラスを用いる
scope.ScopeClass obj2 = new scope.ScopeClass();
System.Console.WriteLine(obj2.num);
}
}
名前空間の階層
名前空間は入れ子にして階層化することができます。
階層化した名前空間を利用するには「.」区切り、ディレクトリのよう使用します。
namespace scope
{
class ScopeClass
{
public string str = "scope.ScopeClass";
}
// 名前空間の階層化
namespace innerscope
{
class ScopeClass
{
public string str = "scope.innerscope.ScopeClass";
}
}
}
class Program
{
static void Main()
{
scope.ScopeClass obj1 = new scope.ScopeClass();
System.Console.WriteLine(obj1.str);
scope.innerscope.ScopeClass obj2 = new scope.innerscope.ScopeClass();
System.Console.WriteLine(obj2.str);
}
}
アクセシビリティ(accessibility) について
アクセス修飾子
C#では名前空間直下のメンバにアクセス可能な範囲を制御するためのアクセス修飾子が2つ用意されています。
(なお、これはトップレベルコンテナの話であり、クラスや列挙対などのメンバへのアクセス修飾子とは違う仕様についてのことです。)
アクセス修飾子は以下の通りです。
public | アクセスは制限されない。(どこからでもアクセス可能。) |
internal | 要素が含まれるプログラム(アセンブリ)内からのみアクセス可能 (assembly scope)。 |
アクセス修飾子を指定しない場合
名前空間直下でアクセス修飾子を指定していない場合、クラスなどの型データは「internal」になります。
つまり、別のプログラム(アセンブリ)から呼び出す場合にのみ「public」を記述する必要があります。
usingについて
usingとは
「using」文を用いると、定義した名前空間を現在の名前空間に追加することができます。
using 名前空間名;
名前空間に追加とは、using宣言以降のソース中では特定の名前空間へのアクセスを行なう際にスコープ演算子を省略することを意味します。
using sub_scope;
namespace sub_scope
{
public class ScopeClass
{
public string str = "sub_scope.ScopeClass";
}
}
namespace main_scope
{
class Program
{
static void Main()
{
// sub_scopeの名前空間名を省略できる。
ScopeClass obj1 = new ScopeClass();
System.Console.WriteLine(obj1.str);
}
}
}
エイリアス
名前空間名を別名として扱うことができます。
階層化した名前空間を別名に定義することで、コードの可読性を向上させる目的に使用できます。
using name1 = nameA.nameB;