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

可以通过隐藏变量来隐藏该变量,即,使用同一名称的变量来重新定义该变量。 可以通过两种方式对你想要隐藏的变量执行阴影操作:

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

  • 通过继承隐藏。 如果要隐藏的变量是在类级别定义的,可以通过继承将其隐藏,方法是使用派生类中的 Shadows 关键字对其进行重新声明。

用于隐藏变量的两种方法

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

  1. 确定定义要隐藏的变量的区域,同时确定要在其中使用变量重新定义它的子区域。

    变量的区域 允许用于重新定义要隐藏变量的子区域
    模块 模块内的类
    类中的子类

    类中的过程

    不能在该过程中的块内重新定义过程变量,例如在 IfEnd 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。 局部变量 num 将在 show 中对模块级变量 num 执行隐藏,因此局部变量设置为 2。 但是,在 useModuleLevelNum 过程中没有局部变量可对 num 执行隐藏。 因此,useModuleLevelNum 将模块级变量的值设置为 1。

    show 中的调用 MsgBox,可以通过使用模块名称限定 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 变量,并在派生类中隐藏该变量。 当 shadowString 名称未限定时,派生类中的 showStrings 过程将显示字符串的隐藏版本。 然后,当 shadowString 使用 MyBase 关键字进行限定时,它会显示隐藏版本。

可靠编程

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

请参阅