如何:隐藏与您的变量同名的变量 (Visual Basic)
可以通过隐藏变量来隐藏该变量,即,使用同一名称的变量来重新定义该变量。 可以通过两种方式对你想要隐藏的变量执行阴影操作:
通过范围隐藏。 可以通过范围将其隐藏,方法是在包含要隐藏的变量的区域的子区域内对其进行重新声明。
通过继承隐藏。 如果要隐藏的变量是在类级别定义的,可以通过继承将其隐藏,方法是使用派生类中的 Shadows 关键字对其进行重新声明。
用于隐藏变量的两种方法
通过范围隐藏变量进行隐藏
确定定义要隐藏的变量的区域,同时确定要在其中使用变量重新定义它的子区域。
变量的区域 允许用于重新定义要隐藏变量的子区域 模块 模块内的类 类 类中的子类
类中的过程不能在该过程中的块内重新定义过程变量,例如在
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 关键字。当派生类中的代码引用变量名称时,编译器将解析对变量的引用。
下面的示例演示通过继承进行隐藏。 它创建两个引用,一个用于访问隐藏变量,另一个用于绕过隐藏。
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
关键字进行限定时,它会显示隐藏版本。
可靠编程
隐藏会引入具有相同名称的变量的多个版本。 当代码语句引用变量名称时,编译器将引用解析为的版本取决于诸如代码语句的位置和是否存在限定字符串等因素。 这会增加引用隐藏变量的意外版本的风险。 可以通过完全限定对隐藏变量的所有引用来降低该风险。