連載

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

Chapter 06 名前空間

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

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

 名前空間の機能は便利だが、名前空間を含む名前をいちいち記述していると、全体的にソース・コードが長くなってしまう。同じ名前のクラスが出現する頻度はさして高いものではなく、それ以外の状況ではできるだけソースを短く書きたいと考えることは、当然の成り行きといえる。これに対応するために、VB.NETにはImportsステートメントが存在する。Importsステートメントは、名前空間名を省略したときのデフォルト名前空間名を指定するために使用することができる。例えば、名前空間名を省略したときに、Sample003n.MySpace1であると指定したサンプル・プログラムがリスト6-6である。

 1: Imports Sample003n.MySpace1
 2:
 3: Namespace MySpace1
 4:   Public Class MyClass1
 5:     Public Shared Sub MyMethod1()
 6:       Trace.WriteLine("MySpace1.MyClass1.MyMethod1 called")
 7:     End Sub
 8:   End Class
 9: End Namespace
10:
11: Namespace MySpace2
12:   Public Class MyClass1
13:     Public Shared Sub MyMethod1()
14:       Trace.WriteLine("MySpace2.MyClass1.MyMethod1 called")
15:     End Sub
16:   End Class
17: End Namespace
18:
19: Public Class Form1
20:   Inherits System.Windows.Forms.Form
21:
22: …Windows フォーム デザイナで生成されたコード…
23:
24:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
25:     MyClass1.MyMethod1()
26:     MySpace2.MyClass1.MyMethod1()
27:   End Sub
28: End Class
リスト6-6 デフォルト名前空間名を指定するためにImportsステートメントを使用したプログラム

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

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

 25行目では、名前空間名の指定を省略して、いきなりMyClass1というクラス名を記述している。このソースには、MyClass1というクラスが2つあるが、コンパイラは混乱することはない。なぜなら、1行目のImportsステートメントにより、省略時のデフォルト名前空間名がSample003n.MySpace1であると指示されているからだ。そのため、25行目のMyClass1は名前空間Sample003n.MySpace1(つまり、Namespace MySpace1で宣言された名前空間)であることが明確なのである。一方、もう1つの名前空間に属するMyClass1を利用するには、26行目のように、名前空間名を明示した長い書き方を必要とする。

 Importsステートメントは、1つに限らずいくつ書いてもよい。つまり、デフォルトの名前空間名は、いくつでも持つことができる。クラス名の重複など、そうめったに起こることではないので、複数のデフォルトの名前空間名を指定しても、通常は問題は起こらない。もし、名前の重複が起きた場合だけ、名前空間名を含むフルネームで記述するようにすれば、問題はない。

 ちなみに、実際に利用する場合は、1つのソースに全部収まっているわけではなく、いくつものソースに分かれていることが多いだろう。例えば、以下のような感じである。

 まず、クラスの定義となるソース・コード。

 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
リスト6-8 リスト6-6のクラス定義部分を1つのソースにしたプログラム(プロジェクト名は「Sample004n」とする)

 次にクラスの利用を記述したソース・コード。

 1: Imports Sample004n.MySpace1
 2:
 3: Public Class Form1
 4:   Inherits System.Windows.Forms.Form
 5:
 6: …Windows フォーム デザイナで生成されたコード…
 7:
 8:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 9:     MyClass1.MyMethod1()
10:     MySpace2.MyClass1.MyMethod1()
11:   End Sub
12: End Class
リスト6-9 リスト6-8を利用するプログラム

 Importsステートメントに関しては、Instancingプロパティの変更別名を定義するImportsステートメントピリオドで区切られた名前とImportsステートメントも参照してほしい。

別名を定義するImportsステートメント

 Importsステートメントには、デフォルトの名前空間名を指定する機能のほかに、名前空間名やクラス名の別名を定義する機能がある。例えばリスト6-10は、Sample005n.MySpace1という名前空間名を「a」という名前で指定可能にし、Sample005n.MySpace2.MyClass1というクラス名を「b」という名前で指定可能にして利用した例である。

 1: Imports a = Sample005n.MySpace1
 2: Imports b = Sample005n.MySpace2.MyClass1
 3:
 4: Namespace MySpace1
 5:   Public Class MyClass1
 6:     Public Shared Sub MyMethod1()
 7:       Trace.WriteLine("MySpace1.MyClass1.MyMethod1 called")
 8:     End Sub
 9:   End Class
10: End Namespace
11:
12: Namespace MySpace2
13:   Public Class MyClass1
14:     Public Shared Sub MyMethod1()
15:       Trace.WriteLine("MySpace2.MyClass1.MyMethod1 called")
16:     End Sub
17:   End Class
18: End Namespace
19:
20: Public Class Form1
21:   Inherits System.Windows.Forms.Form
22:
23: …Windows フォーム デザイナで生成されたコード…
24:
25:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
26:     a.MyClass1.MyMethod1()
27:     b.MyMethod1()
28:   End Sub
29: End Class
リスト6-10 Importsステートメントにより名前空間名やクラス名の別名を定義したプログラム(プロジェクト名は「Sample005n」とする)

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

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

 ソースの1〜2行目で、キーワード“a”が名前空間Sample005n.MySpace1であるとし、キーワード“b”がSample005n.MySpace2.MyClass1であると宣言している。そのため、26行目では、

Sample005n.MySpace1.MyClass1.MyMethod1()

と記述する代わりに、

a.MyClass1.MyMethod1()

と記述することで等価な機能を短く記述している。同様に27行目では、

Sample005n.MySpace2.MyClass1.MyMethod1()

と記述する代わりに、

b.MyMethod1()

と短く記述するだけで済んでいる。

 この機能は、ソース・コード上のさまざまな部分で利用できる。例えば、クラスを継承する際のInheritsステートメントに指定するクラス名も、この機能で付加した別名でよい(継承については、継承とポリモーフィズムを参照)。リスト6-12は、クラスMyClass1の別名として「a」という名前を宣言したうえで継承を行った例である。

 1: Imports a = Sample009n.MyClass1
 2:
 3: Public Class MyClass1
 4:   Public Shared Sub MyMethod1()
 5:     Trace.WriteLine("MyClass1.MyMethod1 called")
 6:   End Sub
 7: End Class
 8:
 9: Public Class MyClass2
10:   Inherits a
11: End Class
12:
13: Public Class Form1
14:   Inherits System.Windows.Forms.Form
15:
16: …Windows フォーム デザイナで生成されたコード…
17:
18:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
19:     a.MyMethod1()
20:     MyClass2.MyMethod1()
21:   End Sub
22: End Class
リスト6-12 Importsステートメントによりクラス名の別名を宣言したプログラム

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

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

 まず、注目すべき点はソースの10行目である。“Inherits a”と書かれているが、“a”は当然MyClass1(フルネームはSample009n.MyClass1。Sample009nはこのプログラムのプロジェクト名)の別名として機能しており、MyClass2はMyClass1を継承している。そのことは、20行目を見るとはっきりと分かる。MyClass2を通して、MyClass1のメソッドを呼び出すことができている。また、19行目では“a”が完全にMyClass1と等価のキーワードとして機能していることが分かるだろう。

 この機能は、普通に記述すると長くなる指定を、短く読みやすくするために使うことができる。特に、同じクラス名などが存在する場合に、適切な別名を用意するために使用すると、読みやすいプログラム・コードを記述できるだろう。


 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