連載

プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――

第17回 名前空間とImports文(前編)

(株)ピーデー
川俣 晶
2002/09/21

Page1 Page2

名前空間の効能

 プログラムを開発中に、既存のソース・コードを取り込んで利用できることに気付くのは珍しくない。しかし、単純に既存のソース・コードを、開発中のソース・コードに取り込めばすぐ使えるとは限らない。例えば、重要なクラスやメソッドの名前が重複していて、そのままではコンパイル・エラーになってしまうことが起こりえる。このような状況に対処するために、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のオブジェクト・ブラウザ経由で見ればすぐに分かる。

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とは、このサンプル・プログラムのプロジェクト名である。このソースはまったく問題なく動作する。こういう呼び出し方もあることを頭に入れておくとよいだろう。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第17回 名前空間とImports文(前編)
  1.名前空間の効能
    2.デフォルトの名前空間を指定するImports文
 
「プロフェッショナル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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間