次の方法で共有


方法: 変数と同じ名前の変数を非表示にする (Visual Basic)

変数を非表示にするには、 シャドウを 付けます。つまり、同じ名前の変数で再定義します。 非表示にする変数は、次の 2 つの方法でシャドウできます。

  • スコープを介したシャドウ。 非表示にする変数を含む領域のサブ領域内で再宣言することで、スコープを通じてシャドウできます。

  • 継承によるシャドウ。 非表示にする変数がクラス レベルで定義されている場合は、派生クラスの Shadows キーワードを使用して再宣言することで、継承によってシャドウできます。

変数を非表示にする 2 つの方法

スコープを使用して変数をシャドウして非表示にするには

  1. 非表示にする変数を定義する領域を決定し、変数で再定義するサブ領域を決定します。

    変数のリージョン 再定義可能なサブ領域
    モジュール モジュール内のクラス
    クラス クラス内のサブクラス

    クラス内のプロシージャ

    If...End If 構築やFor ループなど、そのプロシージャ内のブロック内のプロシージャ変数を再定義することはできません。

  2. サブリージョンがまだ存在しない場合は作成します。

  3. サブ領域内に、シャドウ変数を宣言する 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変数を宣言しています。 ローカル変数numshow内でnumモジュール レベルの変数をシャドウするため、ローカル変数は 2 に設定されます。 ただし、useModuleLevelNum プロシージャにシャドウ numするローカル変数はありません。 したがって、 useModuleLevelNum モジュール レベル変数の値を 1 に設定します。

    show内のMsgBox呼び出しでは、モジュール名でnumを修飾することで、シャドウ メカニズムがバイパスされます。 そのため、ローカル変数の代わりにモジュール レベルの変数が表示されます。

継承によって変数をシャドウして非表示にするには

  1. 非表示にする変数がクラスおよびクラス レベル (プロシージャ外) で宣言されていることを確認します。 それ以外の場合は、継承によってシャドウすることはできません。

  2. 変数のクラスから派生したクラスを定義します (まだ存在しない場合)。

  3. 派生クラス内に、変数を宣言する 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 が修飾されていない場合に、文字列のシャドウ バージョンを表示します。 その後、 shadowStringMyBase キーワードで修飾されると、シャドウされたバージョンが表示されます。

堅牢なプログラミング

シャドウ処理では、同じ名前の変数の複数のバージョンが導入されます。 コード ステートメントが変数名を参照する場合、コンパイラが参照を解決するバージョンは、コード ステートメントの場所や修飾文字列の存在などの要因によって異なります。 これにより、シャドウされた変数の意図しないバージョンを参照するリスクが高くなる可能性があります。 シャドウされた変数へのすべての参照を完全に修飾することで、そのリスクを低くできます。

こちらも参照ください