如何在 VB.net 中的子例程外声明对象数组

How do I declare arry of objects outside a soubroutine in VB.net

我写了一个代码来演示这个问题:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        doSomething()
    End Sub

    Dim controlArr() As Object = {NumericUpDown1, NumericUpDown2, NumericUpDown3, NumericUpDown4, CheckBox1, CheckBox2, CheckBox3, CheckBox4}
    Private Sub doSomething()
        Dim testStr As String = ""
        For Each control In controlArr
            Select Case control.GetType
                Case GetType(NumericUpDown)
                    control.value = 1
                Case GetType(CheckBox)
                    control.checked = True
            End Select
        Next
    End Sub
End Class

当我 运行 代码收到空引用异常“对象引用未设置到对象的实例”时,当我在 [=13= 中声明 controlArr 数组时错误消失] 子程序。无论如何,我更愿意在外部声明它,因为我在许多函数中都使用它。我想更好地理解它,所以如果你给我提供一个我可以阅读的主题,我将非常感激。非常感谢您的帮助。

问题是在构造函数之前处理声明。这意味着这一行:

Dim controlArr() As Object = {NumericUpDown1, NumericUpDown2, NumericUpDown3, NumericUpDown4, CheckBox1, CheckBox2, CheckBox3, CheckBox4}

在创建表单上的所有控件并将它们分配给那些字段的代码之前执行。因此,在执行代码时所有字段都是 Nothing ,因此您的数组包含很多东西。创建对象来初始化这样的字段没有问题,并且该代码确实成功创建了一个数组。只是您将该数组的每个元素隐式设置为 Nothing,所以这就是您稍后要使用的内容。

如果要引用任何控件,则必须等到创建窗体控件之后。这意味着,最早在构造函数中调用 InitializeComponent 之后。更一般地说,您应该在 Load 事件处理程序中执行此操作,例如

Dim controlArr As Object()

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Form1.Load
    controlArr = {NumericUpDown1, NumericUpDown2, NumericUpDown3, NumericUpDown4, CheckBox1, CheckBox2, CheckBox3, CheckBox4}
End Sub