連載

改訂版 プロフェッショナルVB.NETプログラミング

Chapter 06 名前空間

株式会社ピーデー 川俣 晶
2004/04/29
Page1 Page2 Page3


 本記事は、(株)技術評論社が発行する書籍『VB6プログラマーのための入門 Visual Basic .NET 独習講座』の一部分を許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。

 名前空間は、クラスなどが所属する世界を分ける機能である。例えば、たくさんの既存のクラスを集めて活用する場合、その中には、たまたま同じ名前を持つクラスなどが存在している場合がある。しかし、名前空間の機能を活用すれば、同じ名前のクラスも別の名前空間に属しているとして、同時に活用することができる。クラス・ライブラリ活用には必須の機能といえるので、機能をしっかりと把握しておくとよいだろう。

名前空間の効能

 プログラムの開発中に、既存のソース・コードを取り込んで利用できることに気付くのは珍しくない。しかし、単純に既存のソース・コードを、開発中のソース・コードに取り込めばすぐ使えるものとは限らない。例えば、重要なクラスやメソッドの名前が重複していて、そのままではコンパイル・エラーになってしまうことが起こりえる。このような状況に対処するために、VB 6にはPrivateキーワードなどの機能が備わっている。Privateキーワードは、メソッドなどの有効範囲を特定のモジュール内に限定することで、別モジュールに同名のメソッドがあってもトラブルを起こさないようにすることができる。この機能はVB.NETにも含まれているが、もし、モジュール内に限定することができない、つまり、Publicであるべきキーワードが対象であるなら、この方法では逃げられない。このような状況でも有効に対処できる機能として、VB.NETには名前空間という機能が存在している。

 名前空間は、クラスなどのプログラミング要素を入れる入れ物である。名前空間はいくつでも定義することができ、名前空間が異なっていれば、同じ名前のクラスなどを作成することができる。名前空間自身も名前を持っていて、名前空間の名前も明示すれば、同じ名前のクラスを使い分けることができる。リスト6-1は、実際に同じ名前の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: …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
リスト6-1 同名の2つのクラスが存在するプログラム

 これを実行すると以下のようになる。

1: MySpace1.MyClass1.MyMethod1 called
2: MySpace2.MyClass1.MyMethod1 called
リスト6-2 リスト6-1の実行結果

 このソース・コードには、2〜6行目と、10〜14行目に、MyClass1という名前のクラスの定義が記述されている。普通ならこのような内容を記述するとコンパイル・エラーになるのだが、このソースはエラーにならない。その理由は、1〜7行目と、9〜15行目のNamespace宣言にある。1〜7行目のNamespace宣言は、この範囲がMySpace1という名前空間に属していることを指定している。9〜15行目のNamespace宣言は、この範囲がMySpace2という名前空間に属していることを指定している。異なる名前空間に属していれば、同名のクラスが存在してもよいので、このソース・コードはエラーを起こさない。

 次に注目すべきことは、これらのクラスを参照する方法である。ソース23〜24行目では、実際にこの2つのクラスに属するメソッドを呼び出している。通常、クラスMyClass1の共有メソッド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という名前で扱うことができ、便利である。

暗黙の名前空間名

 リスト6-1では、“Namespace MySpace1”というように名前空間を宣言していたため、MySpace1が名前空間名であるかのように思えるもしれない。だが、これは真の名前空間名というわけではない。そのことは、Visual Studio .NETのオブジェクトブラウザ経由で見ればすぐに分かる。

●図6-3 Visual Studio .NETのクラス・ブラウザで見た名前空間

 見てのとおり、MySpace1という名前空間名はなく、その代わりにSample001n.MySpace1という名前空間名が存在する。同様にMySpace2ではなく、Sample001n.MySpace2である。「Sample001n」はプロジェクト名である。つまり、暗黙のうちに「プロジェクト名+ピリオド」が、Namespace宣言で宣言した名前の先頭に付加されていることになる。また、一見、名前空間名を何も指定していないかのように見えたForm1クラスも、プロジェクト名の名前空間の下に存在することが読み取れるだろう。

 では、もし真の名前空間名をソース・コード中で指定したら何が起こるだろうか。実際に記述してみたソース・コードがリスト6-4である。

 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: …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
リスト6-4 真の名前空間名でメソッドを呼び出すプログラム

 これを実行すると以下のようになる。

1: MySpace1.MyClass1.MyMethod1 called
2: MySpace2.MyClass1.MyMethod1 called
リスト6-5 リスト6-4の実行結果

 ソースの23〜24行目に、真の名前空間名を記述してみた。ここで「Sample002n」とは、このサンプル・プログラムのプロジェクト名である。このソースはまったく問題なく動作する。こういう呼び出し方もあることを頭に入れておくとよいだろう。


 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Chapter 06 名前空間
  1.名前空間の効能/暗黙の名前空間名
    2.デフォルトの名前空間を指定するImportsステートメント/別名を定義するImportsステートメント
    3.ピリオドで区切られた名前とImportsステートメント/C#で記述されたクラス・ライブラリと混在したときの名前空間名の注意/Namespace宣言を用いずに記述されたクラスが属する名前空間
 
「改訂版 プロフェッショナルVB.NETプログラミング 」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH