2-10 ネームスペース (namespace)
2-10-1 ネームスペースの定義
すでにサンプルプログラムには登場していますが、1 つのソースプログラムは、「ネームスペース」とよばれる論理的なブロックで構成されます。1 つのプログラムファイルには複数のネームスペースをもつことができ、また、複数のソースファイルに分割して、1 つのネームスペースを構成することもできます。
[例] 2 つのネームスペース
1:namespace MySpace1
2:{
3: // クラス等の記述
4:}
5:namespace MySpace2
6:{
7: // クラス等の記述
8:}
また、ネームスペースは階層構造にすることもできます。つまり、1 つのネームスペースの中に、ネストして(入れ子にして)子供のネームスペースを定義することができます。
[例]ネームスペース MySpace1 の中に ネームスペース Web を定義
1:namespace MySpace1
2:{
3: namespace Web
4: {
5: }
6:}
なお、前記の Web ネームスペースを入れ子で記述しなくても MySpace1.web という名前で定義すれば、MySpace1 内の Web ネームスペースという意味になります。
2-10-2 ドットによるネームスペースの指定
.NET Framework の Base クラスライブラリのそれぞれのクラスも、いずれかのネームスペースに定義されています。既に登場している WriteLine メソッドをもつ Console クラスも、System ネームスペースに所属しています。
ある特定のクラスを参照するとき、そのクラスが自分とは別のネームスペースに所属するとき、そのクラスを特定するためにネームスペースを特定する必要があります。既にサンプルで扱っている以下の書き方は、Console クラスがネームスペース System に所属しているための記述です。
[例] Console クラスの WriteLine メソッドの呼び出し
1: System.Console.WriteLine("Hello, world!");
ネームスペースが階層構造になっているときは、その階層構造をたどってドットでつなげて表現する必要があります。以下は、列挙型の定義が、3 段階の階層構造を形成するネームスペースに存在している場合です。
[例] FlyType 列挙型を利用する
1: MySpace1.MyLibs.Parts.FlyType t;
2: t = MySpace1.MyLibs.Parts.FlyType.Business;
ネームスペースの階層が深くなる場合、毎回このように記述するのは手間がかかります。この記述を簡略化する方法があります。それが次項で扱う「キーワード using」です。
2-10-3 using によるネームスペースの指定
using キーワードを使って、いったんネームスペースの使用を宣言すると、それ以降では、ネームスペースとドットを使って特定する書き方を省略することができます。例えば、以下のように「using System;」と宣言すれば、それ以降では、System ネームスペースに所属する Console クラスを参照する際に、ネームスペース「System.」の記述を省略することができます。
[例] using キーワード
1:namespace MySpace
2:{
3: using System; // 暗黙的に 「System.」が利用できる
4: public class MyApp
5: {
6: public static void Main()
7: {
8: Console.WriteLine("Hello!"); //System. 省略可
9: }
10: }
11:}
なお、using キーワードが指定できるのは、ネームスペースの外側か、ネームスペースの直下の内側です。つまり、クラス内やメソッド内で using キーワードを使うことはできません。
また、前述の階層構造になっているネームスペースの例でも同じように記述することができます。
[例]階層構造のネームスペースでの使用
1: using MySpace1.MyLibs.Parts;
2: (中略)
3: FlyType t;
4: t = FlyType.Business;
● for VB6 この「using」キーワードによるネームスペースの使用は、VB でいう参照設定とは異なります。「using」キーワードによる宣言は、ソースコードにおいて、ドットによるネームスペースの特定を省略できるという意味にすぎません。VB において、ある別のクラスを使用するための参照設定は、同じように Visual Studio.NET にも参照設定という機能があります。また、CSC コンパイラでは、/r オプションが参照設定にあたります。 |
[例] abc.dll に対して参照設定をして、Hello.cs をコンパイルする
C:\Labs> csc /r:abc.dll Hello.cs
2-10-4 ネームスペースとアセンブリの違い
ここで説明したネームスペースは、複数のクラスのグルーピングをしたり、複数のファイルから 1 つのネームスペースを構成できますが、**1-3-2 「アセンブリ(プログラムの最小管理単位)」**で説明したアセンブリとは、全く異なる概念です。
ネームスペースは、プログラムの開発者の便宜のために、複数のクラスなどをグルーピングする機能があります。このグルーピングは、論理的なグルーピングであり、コンパイル後の物理ファイルのレベルの分割とは一致しません。1 つの物理ファイルに、複数のネームスペースが存在することがあります。1 つのネームスペースが複数のファイルに渡って共有されている場合もあります。
一方、アセンブリは物理的なファイルのグルーピングであり、プログラムファイルの配置おこなう管理者の便宜のためのグループといえます。1 つのアセンブリは、配置をおこなうための最小単位であり、1 つのアセンブリが 1 つだけのファイルのこともあれば、複数のファイルから 1 つのアセンブリを構成する場合もあります。しかし、アセンブリが異なれば、物理ファイルも異なります。
Base クラスライブラリでは、ファイル名が「System.Data.dll」というファイルに、System ネームスペース配下の Data ネームスペースのクラスが格納されており、このファイルは「System.Data」という名前のアセンブリのファイルですが、ファイル名とネームスペースとの間に直接的な関係はありません。また、「System.Data」というのはこれ自体がアセンブリ名であり、アセンブリには階層構造の概念はありません。階層構造の概念があるのはネームスペースです。