コードが宣言された要素を参照している場合、Visual Basic コンパイラは参照内の名前をその名前の適切な宣言と一致させます。 同じ名前で複数の要素が宣言されている場合は、その名前を修飾することで、それらの要素のうちどれ を 参照するかを制御できます。
コンパイラは、最 も狭いスコープを持つ名前宣言への名前参照の照合を試みます。 これは、参照を作成するコードから始まり、要素を含む連続したレベルを介して外側に向かって動作することを意味します。
次の例は、同じ名前の 2 つの変数への参照を示しています。 この例では、モジュール container
のスコープの異なるレベルで、それぞれ totalCount
という名前の 2 つの変数を宣言します。 プロシージャ showCount
修飾なしで totalCount
を表示すると、Visual Basic コンパイラは、最も狭いスコープ (つまり、 showCount
内のローカル宣言) で宣言への参照を解決します。 含まれるモジュール container
でtotalCount
を修飾すると、コンパイラは、より広いスコープで宣言への参照を解決します。
' Assume these two modules are both in the same assembly.
Module container
Public totalCount As Integer = 1
Public Sub showCount()
Dim totalCount As Integer = 6000
' The following statement displays the local totalCount (6000).
MsgBox("Unqualified totalCount is " & CStr(totalCount))
' The following statement displays the module's totalCount (1).
MsgBox("container.totalCount is " & CStr(container.totalCount))
End Sub
End Module
Module callingModule
Public Sub displayCount()
container.showCount()
' The following statement displays the containing module's totalCount (1).
MsgBox("container.totalCount is " & CStr(container.totalCount))
End Sub
End Module
要素名の修飾
この検索プロセスをオーバーライドし、より広い範囲で宣言された名前を指定する場合は、より広い範囲の包含要素で名前を 修飾 する必要があります。 場合によっては、含まれる要素を修飾する必要がある場合もあります。
名前を修飾することは、ソース ステートメント内の名前の前に、ターゲット要素が定義されている場所を識別する情報を含むということです。 この情報は修飾 文字列と呼ばれます。 これには、1 つ以上の名前空間と、モジュール、クラス、または構造体を含めることができます。
修飾文字列では、ターゲット要素を含むモジュール、クラス、または構造体を明確に指定する必要があります。 コンテナーは、別の包含要素 (通常は名前空間) に配置される場合があります。 修飾文字列に複数の要素を含める必要がある場合があります。
名前を修飾して宣言された要素にアクセスするには
要素が定義されている場所を決定します。 これには、名前空間や名前空間の階層が含まれる場合があります。 最下位レベルの名前空間内では、要素はモジュール、クラス、または構造体に含まれている必要があります。
' Assume the following hierarchy exists outside your code. Namespace outerSpace Namespace innerSpace Module holdsTotals Public Structure totals Public thisTotal As Integer Public Shared grandTotal As Long End Structure End Module End Namespace End Namespace
ターゲット要素の位置に基づいて修飾パスを決定します。 最上位レベルの名前空間から開始し、最下位レベルの名前空間に進み、ターゲット要素を含むモジュール、クラス、または構造体で終了します。 パス内の各要素には、その後に続く要素が含まれている必要があります。
outerSpace
→innerSpace
→holdsTotals
→totals
ターゲット要素の修飾文字列を準備します。 パス内のすべての要素の後にピリオド (
.
) を配置します。 アプリケーションは、修飾文字列内のすべての要素にアクセスできる必要があります。outerSpace.innerSpace.holdsTotals.totals.
通常の方法でターゲット要素を参照する式または代入ステートメントを記述します。
grandTotal = 9000
ターゲット要素名の前に修飾文字列を付けます。 名前は、要素を含むモジュール、クラス、または構造体に続くピリオド (
.
) の直後に付く必要があります。' Assume the following module is part of your code. Module accessGrandTotal Public Sub setGrandTotal() outerSpace.innerSpace.holdsTotals.totals.grandTotal = 9000 End Sub End Module
コンパイラは修飾文字列を使用して、ターゲット要素参照と一致できる明確で明確な宣言を見つけます。
また、アプリケーションが同じ名前を持つ複数のプログラミング要素にアクセスできる場合は、名前参照を修飾する必要があります。 たとえば、 System.Windows.Forms と System.Web.UI.WebControls の両方の名前空間には、 Label
クラス (System.Windows.Forms.Label と System.Web.UI.WebControls.Label) が含まれています。 アプリケーションで両方を使用する場合、または独自の Label
クラスを定義する場合は、異なる Label
オブジェクトを区別する必要があります。 変数宣言に名前空間またはインポート エイリアスを含めます。 次の例では、インポート エイリアスを使用します。
' The following statement must precede all your declarations.
Imports win = System.Windows.Forms, web = System.Web.UI.WebControls
' The following statement references the Windows.Forms.Label class.
Dim winLabel As New win.Label()
その他の包含要素のメンバー
別のクラスまたは構造体の非共有メンバーを使用する場合は、まず、クラスまたは構造体のインスタンスを指す変数または式でメンバー名を修飾する必要があります。 次の例では、 demoClass
は class1
という名前のクラスのインスタンスです。
Dim demoClass As class1 = New class1()
demoClass.someSub[(argumentlist)]
クラス名自体を使用して、 Shared ではないメンバーを修飾することはできません。 最初にオブジェクト変数 (この場合は demoClass
) にインスタンスを作成してから、変数名で参照する必要があります。
クラスまたは構造体に Shared
メンバーがある場合は、そのメンバーをクラス名または構造体名で修飾するか、インスタンスを指す変数または式を使用して修飾できます。
モジュールには個別のインスタンスがないため、そのすべてのメンバーは既定で Shared
されます。 そのため、モジュール名でモジュール メンバーを修飾します。
次の例は、モジュール メンバー プロシージャへの修飾参照を示しています。 この例では、perform
という名前の 2 つのSub
プロシージャをプロジェクト内の異なるモジュールで宣言します。 それぞれが独自のモジュール内で修飾なしで指定できますが、他の場所から参照される場合は修飾する必要があります。
module3
の最後の参照はperform
を修飾しないため、コンパイラはその参照を解決できません。
' Assume these three modules are all in the same assembly.
Module module1
Public Sub perform()
MsgBox("module1.perform() now returning")
End Sub
End Module
Module module2
Public Sub perform()
MsgBox("module2.perform() now returning")
End Sub
Public Sub doSomething()
' The following statement calls perform in module2, the active module.
perform()
' The following statement calls perform in module1.
module1.perform()
End Sub
End Module
Module module3
Public Sub callPerform()
' The following statement calls perform in module1.
module1.perform()
' The following statement makes an unresolvable name reference
' and therefore generates a COMPILER ERROR.
perform() ' INVALID statement
End Sub
End Module
プロジェクトへの参照
別のプロジェクトで定義されている Public 要素を使用するには、まず、そのプロジェクトのアセンブリまたはタイプ ライブラリへの 参照 を設定する必要があります。 参照を設定するには、[プロジェクト] メニューの [参照の追加] をクリックするか、-reference (Visual Basic) コマンド ライン コンパイラ オプションを使用します。
たとえば、.NET Framework の XML オブジェクト モデルを使用できます。 System.Xml名前空間への参照を設定する場合は、XmlDocumentなど、任意のクラスを宣言して使用できます。 次の例では、XmlDocumentを使用します。
' Assume this project has a reference to System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As System.Xml.XmlDocument
含まれる要素のインポート
Imports ステートメント (.NET 名前空間と型) を使用して、使用するモジュールまたはクラスを含む名前空間をインポートできます。 これにより、名前を完全に修飾せずに、インポートされた名前空間で定義されている要素を参照できます。 次の例では、前の例を書き換えて、 System.Xml 名前空間をインポートします。
' Assume this project has a reference to System.Xml
' The following statement must precede all your declarations.
Imports System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As XmlDocument
さらに、 Imports
ステートメントでは、インポートされた各名前空間の インポート エイリアス を定義できます。 これにより、ソース コードが短くなり、読みやすくなります。 次の例では、System.Xml名前空間のエイリアスとしてxD
を使用するように前の例を書き換えます。
' Assume this project has a reference to System.Xml
' The following statement must precede all your declarations.
Imports xD = System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As xD.XmlDocument
Imports
ステートメントでは、他のプロジェクトの要素をアプリケーションで使用することはできません。 つまり、参照を設定する代わりには使用されません。 名前空間をインポートすると、その名前空間で定義されている名前を修飾する要件が削除されます。
Imports
ステートメントを使用して、モジュール、クラス、構造体、および列挙型をインポートすることもできます。 その後、このようなインポートされた要素のメンバーを修飾なしで使用できます。 ただし、クラスまたは構造体の非共有メンバーは、クラスまたは構造体のインスタンスに評価される変数または式で常に修飾する必要があります。
名前付けガイドライン
同じ名前を持つ 2 つ以上のプログラミング要素を定義すると、コンパイラがその名前への参照を解決しようとしたときに、 名前のあいまいさが 発生する可能性があります。 複数の定義がスコープ内にある場合、または定義がスコープ内に存在しない場合、参照は取り返しできません。 例については、このヘルプ ページの「修飾された参照例」を参照してください。
すべての要素に一意の名前を付けることで、名前のあいまいさを回避できます。 その後、名前空間、モジュール、またはクラスで名前を修飾しなくても、任意の要素への参照を行うことができます。 また、誤って間違った要素を参照する可能性を減らします。
シャドーイング
2 つのプログラミング要素が同じ名前を共有している場合、そのうちの 1 つは、もう 1 つの要素を非表示 ( シャドウ) できます。 シャドウされた要素は参照できません。代わりに、コードでシャドウされた要素名を使用すると、Visual Basic コンパイラによってシャドウ要素に解決されます。 例の詳細については、「 Visual Basic でのシャドウ」を参照してください。
こちらも参照ください
.NET