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 ステートメント

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

完全修飾名のグローバルなキーワード

入れ子になった階層構造の名前空間を定義すると、その階層構造の内部にあるコードが .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 など)、およびプロジェクトに関連する任意の名前空間にアクセスできます。

名前空間のステートメント Global キーワード

、. で Global のキーワードを使用できます。 Namespace ステートメントこれは、プロジェクトのルート名前空間から名前空間を定義することもできます。

プロジェクト内のすべての名前空間は、プロジェクトのルート名前空間に基づいています。Visual Studio では、プロジェクト名がプロジェクト内のすべてのコードの既定のルート名前空間として割り当てられます。たとえば、プロジェクト名が ConsoleApplication1 である場合、そのプログラミング要素は ConsoleApplication1 名前空間に属します。Namespace Magnetosphereを宣言すると、プロジェクトの Magnetosphere への参照は ConsoleApplication1.Magnetosphereにアクセスします。

次の例は、プロジェクトのルート名前空間から名前空間を宣言するに Global のキーワードを使用します。

Namespace Global.Magnetosphere

End Namespace


Namespace Global
    Namespace Magnetosphere

    End Namespace
End Namespace

名前空間宣言では、 Global 、別の名前空間に入れ子にすることはできません。

[アプリケーション] ページ (プロジェクト デザイナー) (Visual Basic) プロジェクトの ルート名前空間 を表示および変更するために使用できます。新しいプロジェクトには、プロジェクト名への ルート名前空間 の既定。ボックスが空になるように Global を最上位の名前空間であるために発生する場合は、により ルート名前空間 エントリを消去できます。消去 ルート名前空間 は名前空間宣言の Global のキーワードの必要を削除します。

Namespace ステートメントが、 .NET Framework の名前空間の名前を宣言すると、 .NET Framework の名前空間は Global のキーワードは完全修飾名で使用する使用できなくなります。Global のキーワードを使用しないで .NET Framework の各名前空間へのアクセスを有効にするには、 Namespace ステートメントに Global のキーワードを含めることができます。

次の例に System.Text の名前空間宣言で Global のキーワードがあります。

Global のキーワードが名前空間宣言にない場合は、 StringBuilder は Global.System.Text.StringBuilderを指定しないアクセスできませんでした。ConsoleApplication1という名前のプロジェクトに System.Text への参照は Global のキーワードが使用されていない場合 ConsoleApplication1.System.Text にアクセスします。

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

参照

処理手順

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

関連項目

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

ListBox

System.Windows.Forms

概念

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

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

Office ソリューションのコードの記述