可以通过隐藏变量来 隐藏变量, 即使用同名变量重新定义变量。 可以通过两种方式隐藏要隐藏的变量:
通过范围隐藏。 可以通过范围将其隐藏,方法是在包含要隐藏的变量的区域的子区域内对其进行重新声明。
通过继承隐藏。 如果要隐藏的变量在类级别定义,可以通过在派生类中使用 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
前面的示例在模块级别和过程级别(过程中
num
)声明变量show
。 局部变量num
在num
中会覆盖模块级变量show
,因此局部变量被设置为2。 但是,在num
过程中没有局部变量来遮蔽useModuleLevelNum
。 因此,useModuleLevelNum
将模块级变量的值设置为 1。在
MsgBox
中的调用show
,可以通过使用模块名称限定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
,并将其隐藏在派生类中。 派生类中的程序showStrings
在名称shadowString
未限定时显示字符串的隐藏版本。 然后,在shadowString
使用MyBase
关键字限定后,它将显示阴影版本。
可靠的编程
阴影引入了同名变量的多个版本。 当代码语句引用变量名称时,编译器解析引用的版本取决于代码语句的位置和限定字符串的存在等因素。 这会增加引用阴影变量意外版本的风险。 可以通过完全限定对阴影变量的所有引用来降低该风险。