連載

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

Chapter 06 名前空間

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

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

 ピリオド記号(.)は、名前空間名とそのほかの名前を区切るために用いられるほか、名前空間名の一部として用いることもできる。例えば、MySpace1.MySpace2という名前を、名前空間名として用いることもできる。実際、これが実現できなければ、暗黙の名前空間名で述べたように、プロジェクトSample001でNamespace MySpace1として宣言される名前空間の真の名前が、Sample001.MySpace1であるという仕様は許されなくなってしまう。ピリオド記号は、Namespace宣言で指定する名前の一部としても問題なく指定できるので、Namespace MySpace1.MySpace2と記述してもよい。その際、Importsステートメントで指定する別名は、このように指定される名前空間名の一部を置き換える形でもよい。文字で説明しても分かりにくいかもしれないので、さっそくサンプル・プログラムを見てみよう。

 1: Imports a = Sample006n.MySpace1
 2:
 3: Namespace MySpace1.MySpace2
 4:   Public Class MyClass1
 5:     Public Shared Sub MyMethod1()
 6:       Trace.WriteLine("MySpace1.MySpace2.MyClass1.MyMethod1 called")
 7:     End Sub
 8:   End Class
 9: End Namespace
10:
11: Public Class Form1
12:   Inherits System.Windows.Forms.Form
13:
14: …Windows フォーム デザイナで生成されたコード…
15:
16:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
17:     Sample006n.MySpace1.MySpace2.MyClass1.MyMethod1()
18:     a.MySpace2.MyClass1.MyMethod1()
19:   End Sub
20: End Class
リスト6-14 ピリオドで区切られた名前空間名を使用したプログラム

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

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

 このソースの1行目では、Importsステートメントを用いて、“a”というキーワードに、Sample006n.MySpace1という名前空間名の一部を対応付けている。そして、18行目ではこの“a”というキーワードを用いて、

a.MySpace2.MyClass1.MyMethod1()

としてメソッド呼び出しを行っている。名前空間名はMySpace1.MySpace2なので、この名前の一部だけがImportsステートメントによる別名定義の対象になっているが、このような記述方法を行っても問題はない。実際、このソースは問題なく実行できる。また、ソース17行目と18行目は機能的に等価である。

C#で記述されたクラス・ライブラリと混在したときの名前空間名の注意

 本項はC#に関する知識が少し必要だが、分からない読者はC#のソースを読み飛ばしても構わない

 .NET Framework上では、異なるプログラム言語で記述されたクラス・ライブラリを呼び出すことが容易である。しかし、プログラム言語によって名前空間名の扱いが微妙に違うことに注意が必要である。例えば、同じような機能を持つVB.NETで記述されたクラス・ライブラリと、C#で記述されたクラス・ライブラリがあったとしよう。VB.NETで記述されたクラス・ライブラリは次のような内容だったとする(リスト6-16)。

1: Namespace MySpace1
2:   Public Class Class1
3:     Public Shared Sub MyMethod1()
4:       Trace.WriteLine("MySpace1.Class1.MyMethod1 called")
5:     End Sub
6:   End Class
7: End Namespace
リスト6-16 VB.NETでクラス・ライブラリを記述したプログラム(プロジェクト名ClassLibrary1)

 次に、C#で記述されたクラス・ライブラリは次のような内容だったとする(リスト6-17)。

 1: using System;
 2:
 3: namespace MySpace2
 4: {
 5:   public class Class1
 6:   {
 7:     public static void MyMethod1()
 8:     {
 9:       System.Diagnostics.Trace.WriteLine("MySpace2.Class1.MyMethod1 called");
10:     }
11:   }
12: }
リスト6-17 C#でクラス・ライブラリを記述したプログラム(プロジェクト名ClassLibrary2)

 以上の2つのクラス・ライブラリのプロジェクトを参照して利用するソース・コードは、リスト6-18のようになる。

1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2:   ClassLibrary1.MySpace1.Class1.MyMethod1()
3:   MySpace2.Class1.MyMethod1()
4: End Sub
リスト6-18 リスト6-16、6-17を利用するVB.NETのプログラム

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

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

 2つのクラス・ライブラリは、ソース上では同じように記述されているように見えるが、呼び出すときのメソッド名のフルネームの記述方法が違っている。VB.NETで記述したクラス・ライブラリを呼び出す場合には、ClassLibrary1というキーワードを含む名前空間名を記述するが、C#で記述したクラス・ライブラリを呼び出す場合には、Namespace宣言で記述したとおりの名前を書くだけでよい

 この動作の相違は、VB.NETのNamespace宣言とC#のnamespace宣言の挙動の相違によって引き起こされるものである(VB.NETは先頭が大文字のNamespaceキーワードを使うが、C#は先頭が小文字のnamespaceキーワードを使う)。VB.NETのNamespace宣言は、暗黙のうちに名前の先頭にプロジェクト名を付加するが、C#のnamespace宣言はそうではない。クラス・ライブラリの作成や利用の際には注意が必要である。

Namespace宣言を用いずに記述されたクラスが属する名前空間

 Namespace宣言を用いずに記述されたクラスなども、実際にはプロジェクト名と同じ名前空間に属している。そのことは、オブジェクトブラウザで容易に確認することができる。例えば、フォームを定義するForm1クラスは、プロジェクト名と同じ名前の名前空間に属している。そこで、プロジェクト名がaなら、Form1をa.Form1と記述してもコンパイラは理解する。

 しかし、リスト6-20のように、スタートアップ・フォームとなっているForm1を勝手なNamespace宣言で囲むとコンパイラはエラーを引き起こす。

 1: Namespace MySpace1
 2:   Public Class Form1
 3:     Inherits System.Windows.Forms.Form
 4:
 5: …Windows フォーム デザイナで生成されたコード…
 6:
 7:     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 8:       Trace.WriteLine("Form1_Load called")
 9:     End Sub
10:   End Class
11: End Namespace
リスト6-20 スタートアップ・フォームとなっているForm1を独自の名前空間で囲ったプログラム(コンパイル・エラーとなる)

 このソースをコンパイルすると「'Sub Main' が、'Sample008n.Form1' に見つかりませんでした」というエラー・メッセージが出力される。このようなエラーが出力される理由は、プロジェクトのプロパティで指定されているスタートアップ・フォームがSample008n.Form1であるにも関わらず、ソース上でNamespace宣言を挿入して名前空間を含む完全な名前(完全限定名という)を変更してしまったことにある。これを解決するには、スタートアップ・フォームの名前を変更するか、Namespace宣言を取り除く必要がある。End of Article

VB6プログラマーのための入門 Visual Basic .NET 独習講座』

 本記事は、(株)技術評論社が発行する書籍『VB6 プログラマーのための 入門 Visual Basic .NET 独習講座』から
許可を得て転載したものです。

【本連載と書籍の関係について 】
 この書籍は、本フォーラムで連載した「連載 プロフェッショナルVB.NETプログラミング」を大幅に加筆修正し、発行されたものです。技術評論社、および著者である川俣晶氏のご好意により、書籍の内容を本フォーラムの連載記事として掲載させていただけることになりました。

技術評論社の解説ページ

ご注文はこちらから
 

 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