次の方法で共有


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

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を完全修飾せずに使用しようとすると、名前Class1があいまいであることを示すエラーが Visual Basic によって生成されます。

名前空間レベル ステートメント

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

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

名前空間の入れ子になった階層を定義した場合、その階層内のコードが .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.SystemInt32を定義していないため、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 キーワードを使用することもできます。 これにより、プロジェクトのルート名前空間から名前空間を定義できます。

プロジェクト内のすべての名前空間は、プロジェクトのルート名前空間に基づいています。 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 の名前空間でもある名前を宣言すると、Global キーワードが完全修飾名で使用されていない場合、.NET Framework 名前空間は使用できなくなります。 Global キーワードを使用せずにその .NET Framework 名前空間へのアクセスを有効にするには、Namespace ステートメントに Global キーワードを含めることができます。

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

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

こちらも参照ください