ベータ2への切り替え
本連載では、これまで、Visual Studio .NETの日本語版ベータ1を使用し、英語版ベータ2でも動作確認するという方法で行ってきた。しかし、今回より、Visual Studio .NET日本語版ベータ2を前提に解説とサンプルソースの記述を行うこととした。今回以降のサンプルソースは、ベータ1上での実行を保証しないので、読者の皆さんも、ベータ2への切り替えをお願いしたい。
ネストするnamespace
C#は「コンポーネント指向のプログラム言語」だと言われるが、コンポーネント指向とは、すでに作成済みのクラスを持ち寄って、それを利用する形でコーディングを行うことを意味する。その際、まったく無関係に開発されたクラスを集めると、同じ名前のクラスが存在することがあり、名前の衝突というやっかいな問題が発生する可能性がある。これを解決するために、C#では、個々のクラスは、より大きなnamespace(名前空間)に所属するものと考え、namespaceを区別することで、同じ名前のクラスを使い分けることを可能とする。
namespaceについては、この連載の第2回目にも取り上げているので、今回は、そこで述べなかったことを説明する。
まず、namespaceはネスト可能であることに注目してみよう。以下に1つの例を示す。
1: using System;
2:
3: namespace Space1.Sub1
4: {
5: class Class1
6: {
7: public static void test()
8: {
9: Console.WriteLine("Space1.Sub1.test() called");
10: }
11: }
12: }
13:
14: namespace Space2
15: {
16: namespace Sub1
17: {
18: class Class1
19: {
20: public static void test()
21: {
22: Console.WriteLine("Space2.Sub1.test() called");
23: }
24: }
25: }
26: }
27:
28: namespace ConsoleApplication20
29: {
30: class Class1
31: {
32: static void Main(string[] args)
33: {
34: Space1.Sub1.Class1.test();
35: Space2.Sub1.Class1.test();
36: }
37: }
38: }
|
|
ネストしたnamespaceを使用したサンプル・プログラム1 |
これを実行した結果は以下のようになる。
 |
サンプル・プログラム1の実行結果 |
ネストしたnamespaceも、ピリオド区切りの単一の名前と同様に扱うことができる。
|
ここでは3〜12行目で、Space1.Sub1というネストしていないnamespaceを宣言している。次に14〜26行目で、Space2というnamespaceを宣言し、その内部(16〜25行目)でネストしたnamespaceであるSub1を宣言している。このnamespace内のメソッドを呼び出す場合は、34〜35行目を見て分かるとおり、どちらを呼び出す場合も表記は似たようなものになる。Space1.Sub1のようにピリオドで区切られたnamespaceはそのまま使うが、Space2内にSub1がある、ネストしたnamespaceも、Space2.Sub1のようにピリオド区切りで表記するので、結果的にほとんど同じに見える。実際、この2つの書式には機能的な差はない。つまり、namespaceを宣言する際、ピリオド区切りの単一の名前で書いてもよいし、ネストしたnamespaceとして宣言してもよい。
繰り返し宣言されるnamespace
namespaceの宣言は、1つのブロックにまとめねばならないという制約はない。つまり、同じ名前のnamespaceの宣言が何回出現してもよい。この機能は、非常に重要なものだ。例えば、クラスを100個持つnamespaceを作ろうとしたとき、すべてのクラスが1個のブロック内になければならないという制約があるとしたら、100個のクラスを1個のソースファイル上に記述しなければならず、ソースコードサイズが肥大化して扱いにくくなる。だが、namespaceの宣言が分散を許せば、クラスごとに1ソースファイルとすることもでき、扱いやすくなる。
実際に、同じnamespaceを2つに分けて宣言した例を以下に示す。
1: using System;
2:
3: namespace Space1
4: {
5: class Class1
6: {
7: public static void test()
8: {
9: Console.WriteLine("Space1.Class1.test() called");
10: }
11: }
12: }
13:
14: namespace Space1
15: {
16: class Class2
17: {
18: public static void test()
19: {
20: Console.WriteLine("Space1.Class2.test() called");
21: }
22: }
23: }
24:
25: namespace ConsoleApplication21
26: {
27: class Class1
28: {
29: static void Main(string[] args)
30: {
31: Space1.Class1.test();
32: Space1.Class2.test();
33: }
34: }
35: }
|
|
同じnamespaceを2つに分けて宣言したサンプル・プログラム2 |
これを実行した結果は以下のようになる。
 |
サンプル・プログラム2の実行結果 |
同じ名前の複数のnamespaceにクラスを分けて記述することができる。
|
3〜12行目ではSpace1という名前のnamespaceを宣言している。同じように、14〜23行目でも、同じSpace1というnamespaceを宣言している。2つに分かれているが、これは2つとも、同じnamespaceの宣言の一部として機能する。その証拠に、もし、16行目のClass2というクラスの宣言を、Class1という名前に変更するとエラーになる。なぜなら、Space1というnamespaceの中では、すでに5行目で、Class1という名前のクラスが宣言済みだからだ。1つのnamespaceの中に、同じ名前のクラスを2つ以上持つことはできない。
Insider.NET 記事ランキング
本日
月間