方法: 自分で宣言した変数と同じ名前の変数を隠す (Visual Basic)
変数を隠すには、それをシャドウします。つまり、同じ名前の変数でそれを再定義します。 隠す変数は、次の 2 つの方法でシャドウできます。
スコープによるシャドウ。 スコープによってそれをシャドウするには、隠す変数が含まれている領域のサブ領域内でそれを再宣言します。
継承によるシャドウ。 隠す変数がクラス レベルで定義されている場合は、派生クラスで Shadows キーワードを使用してそれを再宣言することで、継承によってそれをシャドウできます。
変数を隠す 2 つの方法
変数をスコープによってシャドウして隠すには
隠す変数を定義している領域を特定し、独自の変数でそれを再定義するサブ領域を決定します。
変数の領域 その再定義に使用できるサブ領域 Module モジュール内のクラス クラス クラス内のサブクラス
クラス内のプロシージャそのプロシージャ内のブロック (
If
...End If
コンストラクションやFor
ループなど) でプロシージャ変数を再定義することはできません。サブ領域がまだ存在しない場合は作成します。
サブ領域内で、シャドウ変数を宣言する Dim ステートメントを記述します。
サブ領域内のコードで変数名を参照すると、コンパイラによって、シャドウしている変数への参照が解決されます。
次の例は、スコープによるシャドウに加えて、シャドウをバイパスする参照を示しています。
Module shadowByScope ' The following statement declares num as a module-level variable. Public num As Integer Sub show() ' The following statement declares num as a local variable. Dim num As Integer ' The following statement sets the value of the local variable. num = 2 ' The following statement displays the module-level variable. MsgBox(CStr(shadowByScope.num)) End Sub Sub useModuleLevelNum() ' The following statement sets the value of the module-level variable. num = 1 show() End Sub End Module
前の例では、モジュール レベルとプロシージャ レベル (プロシージャ
show
内) の両方で変数num
を宣言しています。 ローカル変数num
で、show
内のモジュールレベル変数num
をシャドウしているため、ローカル変数は 2 に設定されます。 ただし、useModuleLevelNum
プロシージャのnum
をシャドウするローカル変数はありません。 そのため、useModuleLevelNum
では、モジュールレベル変数の値が 1 に設定されます。show
内のMsgBox
呼び出しでは、モジュール名でnum
を修飾することによって、シャドウ メカニズムがバイパスされます。 そのため、ローカル変数ではなくモジュールレベルの変数が表示されます。
変数を継承によってシャドウして隠すには
隠す変数がクラス内かつクラス レベル (プロシージャの外部) で宣言されていることを確認してください。 それ以外の場合、継承によってそれをシャドウすることはできません。
変数がまだ存在しない場合は、変数のクラスから派生したクラスを定義します。
派生クラス内で、変数を宣言する
Dim
ステートメントを記述します。 宣言に Shadows キーワードを含めます。派生クラスのコードで変数名を参照すると、コンパイラによって、変数への参照が解決されます。
次の例に、継承によるシャドウを示しています。 それによって、2 つの参照が作成されます。シャドウする変数にアクセスするものと、シャドウ処理をバイパスするものです。
Public Class shadowBaseClass Public shadowString As String = "This is the base class string." End Class Public Class shadowDerivedClass Inherits shadowBaseClass Public Shadows shadowString As String = "This is the derived class string." Public Sub showStrings() Dim s As String = "Unqualified shadowString: " & shadowString & vbCrLf & "MyBase.shadowString: " & MyBase.shadowString MsgBox(s) End Sub End Class
前の例では、基底クラスで
shadowString
変数を宣言し、派生クラスでそれをシャドウしています。 派生クラスのプロシージャshowStrings
では、名前shadowString
が修飾されていない場合に、文字列のシャドウしているバージョンが表示されます。 さらに、shadowString
がMyBase
キーワードで修飾されている場合は、シャドウされたバージョンが表示されます。
信頼性の高いプログラミング
シャドウによって、同じ名前の変数の複数のバージョンが取り込まれます。 コード ステートメントで変数名を参照する場合、コンパイラによる参照の解決先のバージョンは、コード ステートメントの場所や修飾文字列の存在などの要因によって異なります。 これにより、シャドウされた変数の意図しないバージョンを参照するリスクが高まる可能性があります。 シャドウされた変数へのすべての参照を完全に修飾することで、そのリスクを軽減することができます。
関連項目
.NET