如何:隐藏与您的变量同名的变量 (Visual Basic)

可以通过隐藏变量来 隐藏变量, 即使用同名变量重新定义变量。 可以通过两种方式隐藏要隐藏的变量:

  • 通过范围隐藏。 可以通过范围将其隐藏,方法是在包含要隐藏的变量的区域的子区域内对其进行重新声明。

  • 通过继承隐藏。 如果要隐藏的变量在类级别定义,可以通过在派生类中使用 Shadows 关键字重新声明它来通过继承来隐藏它。

隐藏变量的两种方法

通过范围隐藏变量进行隐藏

  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
    

    前面的示例在模块级别和过程级别(过程中num)声明变量show。 局部变量numnum中会覆盖模块级变量show,因此局部变量被设置为2。 但是,在num过程中没有局部变量来遮蔽useModuleLevelNum。 因此, useModuleLevelNum 将模块级变量的值设置为 1。

    MsgBox 中的调用 show,可以通过使用模块名称限定 num 来绕过隐藏机制。 因此,它显示模块级变量而不是局部变量。

通过继承隐藏变量进行隐藏

  1. 请确保要隐藏的变量是在类中声明并且位于类级别(即任何过程外部)。 否则,你无法通过继承来遮蔽它。

  2. 定义派生自变量的类的类(如果尚不存在)。

  3. 在派生类中,编写声明 Dim 变量的语句。 在声明中包括 Shadows 关键字。

    当派生类中的代码引用变量名称时,编译器将解析对变量的引用。

    下面的示例演示通过继承进行隐藏。 它发出两个引用,一个用于访问阴影变量,一个引用绕过阴影。

    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关键字限定后,它将显示阴影版本。

可靠的编程

阴影引入了同名变量的多个版本。 当代码语句引用变量名称时,编译器解析引用的版本取决于代码语句的位置和限定字符串的存在等因素。 这会增加引用阴影变量意外版本的风险。 可以通过完全限定对阴影变量的所有引用来降低该风险。

另请参阅