Visual Basic における名前空間
アセンブリ内で定義されているオブジェクトは、名前空間によって編成されています。 アセンブリには複数の名前空間を含めることができます。さらに、名前空間の中に他の名前空間を含めることもできます。 名前空間を使用するとあいまいさがなくなるため、クラス ライブラリを使用する場合など、多数のオブジェクトを使用する場合に参照が簡単になります。
たとえば、.NET Framework では、System.Windows.Forms 名前空間に ListBox クラスが定義されています。 次のコードは、このクラスの完全修飾名を使用して変数を宣言する方法を示しています。
Dim LBox As System.Windows.Forms.ListBox
名前の競合の回避
.NET Framework の名前空間は、別のライブラリで似た名前が使用されている場合にクラス ライブラリの開発者が遭遇する、"名前空間の汚染" と呼ばれる問題に対処しています。 このような既存コンポーネントとの競合は、 名前の競合とも呼ばれます。
たとえば、 ListBox
という名前の新しいクラスを作成した場合、プロジェクト内ではこのクラスを修飾子を付けずに使用できます。 ただし、同じプロジェクトで .NET Framework の ListBox クラスを使用する場合は、完全修飾参照を使用して参照を一意にする必要があります。 参照が一意でない場合、Visual Basic では名前があいまいであることを示すエラーが生成されます。 次のコード例では、これらのオブジェクトを宣言する方法を示しています。
' Define a new object based on your ListBox class.
Dim LBC As New ListBox
' Define a new Windows.Forms ListBox control.
Dim MyLB As New System.Windows.Forms.ListBox
次の図は、どちらも ListBox
いう名前のオブジェクトを含む、2 つの名前空間階層を示しています。
既定では、Visual Basic で作成するすべての実行可能ファイルには、プロジェクトと同じ名前の名前空間が含まれます。 たとえば、 ListBoxProject
という名前のプロジェクト内でオブジェクトを定義した場合、実行可能ファイル ListBoxProject.exe には ListBoxProject
という名前空間が含まれます。
複数のアセンブリで同じ名前空間を使用することができます。 Visual Basic では、これらは 1 つの名前セットとして扱われます。 たとえば、 SomeNameSpace
というアセンブリの Assemb1
という名前空間のクラスを定義した後に、 Assemb2
というアセンブリの同じ名前空間のクラスを定義できます。
完全修飾名
完全修飾名は、オブジェクトが定義されている名前空間の名前で始まるオブジェクト参照です。 他のプロジェクトで定義されているオブジェクトを使用するには、 [プロジェクト] メニューの [参照の追加] をクリックしてそのクラスへの参照を作成し、コード内でそのオブジェクトの完全修飾名を使用します。 次のコードは、別のプロジェクトの名前空間のオブジェクトを使用して完全修飾名を使用する方法を示しています。
Dim LBC As New ListBoxProject.Form1.ListBox
完全修飾名を使用すると、どのオブジェクトを使用するかをコンパイラが認識できるため、名前の競合を防止できます。 ただし、名前自体が長くなるため、使いにくくなります。 この問題を回避するには、 Imports
ステートメントを使って エイリアスを定義します。エイリアスとは、完全修飾名の代わりに使用できる短い名前です。 たとえば、次のコード例では、2 つの完全修飾名に対してエイリアスを作成し、作成したエイリアスを使って 2 つのオブジェクトを定義しています。
Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
Dim LBC As LBControl
Dim MyLB As MyListBox
エイリアスを指定せずに Imports
ステートメントを使用すると、インポートした名前空間のすべての名前を修飾子を付けずに使用できます。ただし、それらの名前がプロジェクト内で一意であることが必要です。 プロジェクトに、同じ名前の複数の項目を持つ名前空間をインポートする Imports
ステートメントがある場合は、それらの名前を使用するときに完全修飾名を使用する必要があります。 たとえば、プロジェクトに次の 2 つの Imports
ステートメントがあるとします。
' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2
Class1
を完全修飾せずに使用しようとすると、Class1
という名前があいまいであることを示すエラーが生成されます。
名前空間レベルのステートメント
名前空間内では、モジュール、インターフェイス、クラス、デリゲート、列挙体、構造体、他の名前空間などの項目を定義できます。 プロパティ、プロシージャ、変数、イベントなどの項目を名前空間のレベルで定義することはできません。 これらの項目は、モジュール、構造体、クラスなどのコンテナー内で宣言する必要があります。
完全修飾名の Global キーワード
入れ子になった階層構造の名前空間を定義すると、その階層構造の内部にあるコードが .NET Framework の System 名前空間にアクセスできない場合があります。 次の例は、 SpecialSpace.System
名前空間から Systemにアクセスできない階層構造を示しています。
Namespace SpecialSpace
Namespace System
Class abc
Function getValue() As System.Int32
Dim n As System.Int32
Return n
End Function
End Class
End Namespace
End Namespace
この場合、 System.Int32に SpecialSpace.System
が定義されていないため、Visual Basic コンパイラは Int32
への参照を正しく解決できません。 Global
キーワードを使用すると、修飾チェーンを .NET Framework クラス ライブラリの最も外側のレベルで開始できます。 これにより、クラス ライブラリの System 名前空間や、その他のあらゆる名前空間を指定できるようになります。 次に例を示します。
Namespace SpecialSpace
Namespace System
Class abc
Function getValue() As Global.System.Int32
Dim n As Global.System.Int32
Return n
End Function
End Class
End Namespace
End Namespace
Global
を使用して、 Microsoft.VisualBasicなどの他のルート レベルの名前空間、およびプロジェクトに関連する任意の名前空間にアクセスできます。
名前空間のステートメントでの Global キーワード
Namespace ステートメントで Global
キーワードを使用することもできます。 これにより、プロジェクトのルート名前空間から名前空間を定義できます。
プロジェクト内のすべての名前空間は、プロジェクトのルート名前空間に基づいています。 Visual Studio では、プロジェクト内のすべてのコードで、既定のルート名前空間としてプロジェクト名が割り当てられます。 たとえば、プロジェクト名が ConsoleApplication1
である場合、そのプログラミング要素は ConsoleApplication1
名前空間に属します。 Namespace Magnetosphere
を宣言すると、プロジェクトの Magnetosphere
への参照は ConsoleApplication1.Magnetosphere
にアクセスします。
次の例では、プロジェクトのルート名前空間から名前空間を宣言するために Global
キーワードを使用しています。
Namespace Global.Magnetosphere
End Namespace
Namespace Global
Namespace Magnetosphere
End Namespace
End Namespace
名前空間宣言では、 Global
を別の名前空間に入れ子にすることはできません。
Application Page, Project Designer (Visual Basic) を使用して、プロジェクトの ルート名前空間 を表示および変更できます。 新しいプロジェクトの場合、 ルート名前空間 の既定値は、プロジェクト名です。 Global
を最上位レベルの名前空間にするには、 ルート名前空間 のエントリを消去して、ボックスを空にします。 ルート名前空間 を消去すると、名前空間の宣言で Global
キーワードの必要がなくなります。
Namespace
ステートメントで .NET framework の名前空間にもなっている名前を宣言する場合、 Global
キーワードが完全修飾名で使用されていない場合、.NET Framework 名前空間は使用できなくなります。 Global
キーワードを使用せずに、.NET Framework 名前空間へのアクセスを有効にするには、 Global
キーワードを Namespace
ステートメントに含めます。
次の例では、 Global
名前空間の宣言で、 System.Text
キーワードを使用しています。
名前空間の宣言に Global
キーワードが含まれていない場合、 StringBuilder にアクセスするには、 Global.System.Text.StringBuilder
を指定する必要があります。 ConsoleApplication1
という名前のプロジェクトで、 System.Text
キーワードが使用されていない場合、 ConsoleApplication1.System.Text
を参照すると、 Global
にアクセスすることになります。
Module Module1
Sub Main()
Dim encoding As New System.Text.TitanEncoding
' If the namespace defined below is System.Text
' instead of Global.System.Text, then this statement
' causes a compile-time error.
Dim sb As New System.Text.StringBuilder
End Sub
End Module
Namespace Global.System.Text
Class TitanEncoding
End Class
End Namespace
関連項目
.NET