変数を非表示にするには、 シャドウを 付けます。つまり、同じ名前の変数で再定義します。 非表示にする変数は、次の 2 つの方法でシャドウできます。
スコープを介したシャドウ。 非表示にする変数を含む領域のサブ領域内で再宣言することで、スコープを通じてシャドウできます。
継承によるシャドウ。 非表示にする変数がクラス レベルで定義されている場合は、派生クラスの Shadows キーワードを使用して再宣言することで、継承によってシャドウできます。
変数を非表示にする 2 つの方法
スコープを使用して変数をシャドウして非表示にするには
非表示にする変数を定義する領域を決定し、変数で再定義するサブ領域を決定します。
変数のリージョン 再定義可能なサブ領域 モジュール モジュール内のクラス クラス クラス内のサブクラス
クラス内のプロシージャ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 つの参照を作成します。1 つはシャドウ変数にアクセスし、1 つはシャドウをバイパスします。
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