![](/fdotnet/vb6tonet/index/vb6nettitle_l.jpg) |
|
連載
プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――
第17回 名前空間とImports文(前編)
(株)ピーデー
川俣 晶
2002/09/21
|
名前空間の効能
プログラムを開発中に、既存のソース・コードを取り込んで利用できることに気付くのは珍しくない。しかし、単純に既存のソース・コードを、開発中のソース・コードに取り込めばすぐ使えるとは限らない。例えば、重要なクラスやメソッドの名前が重複していて、そのままではコンパイル・エラーになってしまうことが起こりえる。このような状況に対処するために、VB 6(Visual Basic 6.0)にはPrivateキーワードなどの機能が備わっている。Privateキーワードは、メソッドなどの有効範囲を特定のモジュール内に限定することで、別モジュールに同名のメソッドがあってもトラブルを起こさないようにすることができる。この機能はVB.NET(Visual Basic .NET)にも含まれているが、もし、モジュール内に限定することができない、つまりPublicであるべきキーワードが対象であるなら、この方法では逃げられない。このような状況でも、有効に対処できる機能として、VB.NETには名前空間という機能が存在している。
名前空間は、クラスなどのプログラミング要素を入れる入れ物である。名前空間はいくつでも定義することができ、名前空間が異なっていれば、同じ名前のクラスなどを作成することができる。名前空間自身も名前を持っていて、名前空間の名前も明示すれば、同じ名前のクラスを使い分けることができる。以下は実際に同じ名前のMyClass1というクラスが2個存在するソース・コードである。
1: Namespace MySpace1
2: Public Class MyClass1
3: Public Shared Sub MyMethod1()
4: Trace.WriteLine("MySpace1.MyClass1.MyMethod1 called")
5: End Sub
6: End Class
7: End Namespace
8:
9: Namespace MySpace2
10: Public Class MyClass1
11: Public Shared Sub MyMethod1()
12: Trace.WriteLine("MySpace2.MyClass1.MyMethod1 called")
13: End Sub
14: End Class
15: End Namespace
16:
17: Public Class Form1
18: Inherits System.Windows.Forms.Form
19:
20: #Region " Windows フォーム デザイナで生成されたコード "
21:
22: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
23: MySpace1.MyClass1.MyMethod1()
24: MySpace2.MyClass1.MyMethod1()
25: End Sub
26: End Class
|
|
同名の2つのクラスが存在するVB.NETのサンプル・プログラム1 |
これを実行すると以下のようになる。
1: MySpace1.MyClass1.MyMethod1 called
2: MySpace2.MyClass1.MyMethod1 called
|
|
サンプル・プログラム1の実行結果 |
このソース・コードには、2〜6行目と、10〜14行目に、MyClass1という名前のクラスの定義が記述されている。普通ならこのような内容を記述するとコンパイル・エラーになるのだが、このソースはエラーにならない。その理由は、1〜7行目と、9〜15行目のNamespace文にある。1〜7行目のNamespace文は、この範囲がMySpace1という名前空間に属していることを指定している。9〜15行目のNamespace文は、この範囲がMySpace2という名前空間に属していることを指定している。異なる名前空間に属していれば、同名のクラスが存在してもよいので、このソース・コードはエラーを起こさない。
次に注目すべきことは、これらのクラスを参照する方法である。ソース23〜24行目では、実際にこの2つのクラスに属するメソッドを呼び出している。通常、クラスMyClass1のSharedなメソッドMyMethod1を呼び出すなら、MyClass1.MyMethod1()と記述するだけでよいところだが、この場合、名前空間名も先頭に付加して、MySpace1.MyClass1.MyMethod1()あるいは、MySpace2.MyClass1.MyMethod1()と記述している。
このようなテクニックは、クラス・ライブラリで多用されている。例えば、テキスト入力の機能を持つTextBoxクラスは、.NET Frameworkのクラス・ライブラリ内に2つ存在している。1つは、System.Web.UI.WebControls名前空間に属している。もう1つは、System.Windows.Forms名前空間に属している。これらはそれぞれWebアプリケーションで使われるもの、Windowsアプリケーションで使われるもので、役割は同じだがまったく異なる機能を持ったクラスである。この2つのクラスは、異なる名前空間に存在するため、仮に同時に利用するように指定したとしても混乱することはない。逆に、Webアプリケーションを作成するときも、Windowsアプリケーションを作成するときも、テキスト入力を行うユーザー・インターフェイスを提供するクラスは、TextBoxという名前で扱うことができ、便利である。
暗黙の名前空間名
上のサンプル・プログラムでは、Namespace MySpace1のように名前空間を宣言していたため、MySpace1が名前空間名であるかのように思えたかもしれない。だが、これは真の名前空間名というわけではない。そのことは、Visual Studio .NETのオブジェクト・ブラウザ経由で見ればすぐに分かる。
![](/fdotnet/vb6tonet/vb6tonet17/vb6net17_01.gif) |
Visual Studio .NETのクラス・ブラウザで見た名前空間 |
見てのとおり、MySpace1という名前空間名はなく、その代わりにSample001n.MySpace1という名前空間名が存在する。同様にMySpace2ではなく、Sample001n.MySpace2である。Smaple001nとはプロジェクト名である。つまり、暗黙のうちに、「プロジェクト名+ピリオド」が、Namespace文で宣言した名前の先頭に付加されていることになる。また、一見、名前空間名を何も指定していないかのように見えたForm1クラスも、プロジェクト名の名前空間の下に存在することが読みとれるだろう。
では、もし真の名前空間名をソース・コード中で指定したら何が起こるだろうか。実際に記述してみたソース・コードは以下のとおりである。
1: Namespace MySpace1
2: Public Class MyClass1
3: Public Shared Sub MyMethod1()
4: Trace.WriteLine("MySpace1.MyClass1.MyMethod1 called")
5: End Sub
6: End Class
7: End Namespace
8:
9: Namespace MySpace2
10: Public Class MyClass1
11: Public Shared Sub MyMethod1()
12: Trace.WriteLine("MySpace2.MyClass1.MyMethod1 called")
13: End Sub
14: End Class
15: End Namespace
16:
17: Public Class Form1
18: Inherits System.Windows.Forms.Form
19:
20: #Region " Windows フォーム デザイナで生成されたコード "
21:
22: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
23: Sample002n.MySpace1.MyClass1.MyMethod1()
24: Sample002n.MySpace2.MyClass1.MyMethod1()
25: End Sub
26: End Class
|
|
真の名前空間名でメソッドを呼び出すVB.NETのサンプル・プログラム2 |
これを実行すると以下のようになる。
1: MySpace1.MyClass1.MyMethod1 called
2: MySpace2.MyClass1.MyMethod1 called
|
|
サンプル・プログラム2の実行結果 |
ソース・コードの23〜24行目に、真の名前空間名を記述してみた。ここでSample002nとは、このサンプル・プログラムのプロジェクト名である。このソースはまったく問題なく動作する。こういう呼び出し方もあることを頭に入れておくとよいだろう。
Insider.NET 記事ランキング
本日
月間