【问题标题】:Reference variables and objects elsewhere in a form在表单的其他地方引用变量和对象
【发布时间】:2016-01-19 19:46:38
【问题描述】:

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

我使用以下方法设置了新的表单实例:

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”对象。我认为这是因为发件人是按钮而不是表单本身。但是,我不知道如何从表单中引用设备对象。

【问题讨论】:

  • thisEquip传递 到 ctor 中的表单。它只存在于那里,除非您保存对它的引用以便在其他地方使用它。这一切都与范围有关。 Scope in Visual Basic
  • 我错误地认为,由于两者都在同一个表单类模块中,我可以在按钮事件中以某种方式引用它,类似于您提供的链接中的模块讨论。在按钮事件中引用表单对象的适当方法是什么?我尝试了“Me.thisEquip”并在构造函数中创建了一个单独的引用,例如 thisFormEquip = thisEquip,但这也不起作用

标签: .net vb.net scope


【解决方案1】:

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/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

【讨论】:

  • 有道理;我的问题是我错误地认为构造函数的范围在它处于活动状态时应用于该表单对象。我通过 thisEquip byRef 是因为我想对其应用更改;但现在我正在对 myEquip 应用更改。有没有比在构造函数中传递 thisEquip byRef 更好的地方?
  • 一个对象是一个引用类型(参见Value Types vs Reference Types),所以你应该能够以这种形式对其进行更改。 myEquip thisEquipfooEquip 只是指向真实对象的句柄或指针(“引用”)
  • 你是绝对正确的。这工作正常,并且在表单完成后更改保留在 thisEquip 对象中。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多