名前空間は、アセンブリで定義されているオブジェクトを整理します。 アセンブリには複数の名前空間を含めることができます。この名前空間には、他の名前空間を含めることができます。 名前空間は、クラス ライブラリなどのオブジェクトの大きなグループを使用する場合に、あいまいさを防ぎ、参照を簡略化します。
たとえば、.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 つの名前セットとして扱います。 たとえば、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.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
キーワードを使用することもできます。 これにより、プロジェクトのルート名前空間から名前空間を定義できます。
プロジェクト内のすべての名前空間は、プロジェクトのルート名前空間に基づいています。 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
こちらも参照ください
.NET