Visual Basic における名前空間

アセンブリ内で定義されているオブジェクトは、名前空間によって編成されています。 アセンブリには複数の名前空間を含めることができます。さらに、名前空間の中に他の名前空間を含めることもできます。 名前空間を使用するとあいまいさがなくなるため、多数のオブジェクトを使用する場合 (クラス ライブラリを使用する場合など) に参照が簡単になります。

たとえば、.NET Framework では System.Windows.Forms 名前空間に ListBox クラスが定義されています。 このクラスの完全限定名を使って変数を宣言するコードは、たとえば次のようになります。

Dim LBox As System.Windows.Forms.ListBox

名前の衝突を避けるには

.NET Framework の名前空間は、他のライブラリで似た名前が使用されている場合にクラス ライブラリの開発者が遭遇する、名前空間の汚染と呼ばれる問題に対処しています。 このような既存コンポーネントとの競合は、名前の衝突とも呼ばれます。

たとえば、ListBox という名前の新しいクラスを作成した場合、このクラスをプロジェクト内で使用する場合は、修飾子を付ける必要はありません。 ただし、同じプロジェクトで .NET Framework の ListBox クラスを使用する場合は、参照を一意にするために完全修飾参照を使用する必要があります。 参照が一意でないと、Visual Basic は、名前があいまいであることを指摘するエラーを生成します。 この 2 つのオブジェクトを宣言するコードとしては、次のような例があります。

' 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 つの名前セットとして扱います。 たとえば、Assemb1 というアセンブリの SomeNameSpace という名前空間のクラスを定義した後に、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 を使おうとすると、Visual Basic から、Class1 という名前があいまいであることを指摘するエラーが生成されます。

Namespace Level ステートメント

名前空間の中では、モジュール、インターフェイス、クラス、デリゲート、列挙型、構造体、他の名前空間などの項目を定義できます。 プロパティ、プロシージャ、変数、イベントなどの項目を名前空間のレベルで定義することはできません。 これらの項目は、モジュール、構造体、クラスなどのコンテナー内で宣言する必要があります。

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

この場合、SpecialSpace.System に Int32 が定義されていないため、Visual Basic コンパイラは System.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 など)、およびプロジェクトに関連する任意の名前空間にアクセスできます。

参照

処理手順

方法: コマンド ラインを使用してアセンブリを作成および使用する (C# および Visual Basic)

参照

アセンブリとグローバル アセンブリ キャッシュ (C# および Visual Basic)

Imports ステートメント (.NET 名前空間および型)

ListBox

System.Windows.Forms

概念

参照と Imports ステートメント (Visual Basic)