表格

时间:2015-10-20 23:47:56

标签: .net vb.net scope

我正在尝试将设备对象传递给表单对象,然后在表单上的按钮的单击事件中使用该设备对象。但我不知道如何在按钮事件中正确引用设备对象。

我使用以下方式设置新表单实例:

Public Sub New(ByRef thisEquip As classEquipment)
    Me.InitializeComponent()
    Me.Text = thisEquip.equipName & " Tests"
End Sub

并设置按钮点击事件,如下所示:

Private Sub btnUpdateAndClose_Click(sender As Object, e As EventArgs) Handles btnUpdateAndClose.Click
    Call updateTestList(thisEquip)
End Sub

但是' thisEquip'对象无法识别。我认为这是因为发件人是按钮而不是表单本身。但是,我不知道如何从表单中引用设备对象。

1 个答案:

答案 0 :(得分:4)

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

这通常被称为本地范围。我正在使用程序级别,因为它与其他术语进行了比较和对比。

myBarDoSomething方法中声明,因此它具有过程级别范围 - 它只存在于该方法中。试图在别处使用它会导致错误。这与上面的构造函数示例类似,主要区别在于thisEquip对象作为参数传递而不是在本地声明。

这导致一些人感到困惑:方法中的Dim myFoo声明(创建!)一个新的,仅本地的myFoo变量,该变量与其相同的Form / Class级别变量无关名称。本地版本遮蔽了另一个版本。对此的一些困惑似乎是有些人认为他们需要(重新)使用Dim才能使用变量。你没有。

块级范围

直接来自MSDN:

If n < 1291 Then
    Dim cube As Integer
    cube = n ^ 3
End If

相当数量的VB语句创建块范围For Each / NextIf / End IfUsing / 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