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 つの名前空間階層を示しています。

Screenshot that shows two namespace hierarchies.

既定では、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.Int32SpecialSpace.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

関連項目