Scope 取决于声明变量的位置。您可能在浏览链接时遗漏了一些内容 - 每个范围级别的摘要都包含声明它的短语。
现在看看你的构造函数:
Public Sub New(ByRef thisEquip As classEquipment)
thisEquip 被声明作为构造函数的参数。因此,它只存在于该过程中。该过程在一个表单中或在表单(或模块或其他任何内容)中提到thisEquip 的事实是偶然的。虽然构造函数在某些方面确实很特殊,但就 Scope 而言,它只是另一个过程。
表单级别范围
保存对它的引用以供其他地方使用:
Public Class Form1
' declare a variable to hold the reference
Private myEquip As classEquipment
' declare an array
Private myImgs As Image()
Public Sub New(ByRef thisEquip As classEquipment)
InitializeComponent()
...
myEquip = thisEquip ' assign param to the var
' assign array of images to the Form level var
' via a temp array
myImgs = New Image() {My.Resources.add,
My.Resources.ballblack, My.Resources.ballblue,
My.Resources.ballgreen}
End Sub
在表单级别声明,它具有表单/类级别范围。您现在可以在表单中的任何位置引用 myEquip 或 myImgs。 请勿使用 Dim 仅在将某些内容分配给表单级对象时 - 它会创建一个新的本地但名称相同的变量。
其他常见范围级别:
程序级范围
Private myFoo as Int32
Private Sub DoSomething()
Dim myBar As String
myBar = "Ziggy"
...
Dim myFoo As Int32 = 7
End Sub
这通常称为本地范围。我正在使用程序级别,因为它与其他术语的比较和对比效果更好。
myBar 是在DoSomething 方法中声明的,因此它具有过程级范围——它只存在于该方法中。尝试在其他地方使用它会导致错误。这类似于上面的构造函数示例,主要区别在于 thisEquip 对象是作为参数传递的,而不是在本地声明的。
这导致一些人感到困惑:方法中的Dim myFoo 声明(创建!)一个新的、仅限本地的myFoo 变量,它与同名的表单/类级别变量无关。本地版本掩盖了其他版本。对此的部分困惑似乎是有些人认为他们需要(重新)使用Dim,然后才能使用变量。你没有。
块级范围
直接来自 MSDN:
If n < 1291 Then
Dim cube As Integer
cube = n ^ 3
End If
相当多的 VB 语句创建了一个块作用域(For Each/Next、If/End If 和 Using/End Using)。在块内声明的变量的范围仅限于该块。基本上,(几乎)任何导致缩进的东西都会创建一个块作用域。
Private Sub .....
Dim cube As Int32
If n < 1291 Then
cube = n ^ 3
End If
现在,cube 可以在过程中的其他地方使用:其范围已从 Block 更改为 Local。
更多详细信息,请参见 MSDN:
- Scope In Visual Basic
- Value Types vs Reference Types