如何创建可由表单中的多个方法使用的对象

时间:2014-04-16 12:43:07

标签: .net vb.net winforms class scope

这似乎是一个简单的问题,但我很难学习它。

我有一个VB.NET Windows窗体应用程序。我想在应用程序加载时创建airplane类的一些对象,然后将它们存储在一个数组中,以便其他子和函数可以使用它们。但是,我只能将此数组设置为私有,因此我不能再使用它了。

我正在创建这样的对象:

'create objects on load
Public Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
    myUnits.Text = 0

    Dim plane(4) As airplane
    plane(0) = New airplane("he112", 1, "", 10, 10, 0, 0, 100)
    plane(1) = New airplane("bf109", 1, "", 10, 10, 0, 0, 100)
    plane(2) = New airplane("stuka", 1, "", 10, 10, 0, 0, 100)
    plane(3) = New airplane("do217", 1, "", 10, 10, 0, 0, 100)

    startnewgame()
    plane(0).researchPlane()
End Sub

然后我想稍后使用该数组,如下所示:

Sub refreshIndicators()
    dayIndicator.Text = "Day " & dayNumber
    For Each unit As airplane In plane
        If (unit.isResearched And unit.isFriendly = True And unit.getAmount > 0) Then
            myUnits.Text = myUnits.Text & unit.getName & " " & unit.getAmount & " x" & vbCrLf
        End If
    Next
End Sub

我收到以下错误:

  

"平面"未申报或无法访问。

但是我无法设置"飞机"公开。另外,您认为在Load事件处理程序中使用数组是一种很好的做法吗?

2 个答案:

答案 0 :(得分:1)

您已在Form1_Load方法中定义了变量 airplane ,因此只能从中访问它。如果你想从其他方法访问它,你需要在Form1_Load之外进行delcare:

Dim plane(4) As airplane

'create objects on load
Public Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

答案 1 :(得分:1)

问题在于plane变量的范围。目前,您在Form1_Load方法中将其声明为局部变量。通过这样做,这使得它无法从应用程序中的任何其他方法访问。此外,由于您从未向对象设置任何其他变量(具有更大范围),因此该数组对象将在垃圾收集器的最早方便时得到清理,并且该数组将不再存在。纠正它的方法是将变量声明为类的字段而不是方法的局部变量。当它被声明为类的字段时,它将在类的所有方法的范围内。例如:

Public Class Form1
    Private plane(4) As airplane  ' This is a field of the class, scoped to all methods in the class

    Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        plane(0) = New airplane("he112", 1, "", 10, 10, 0, 0, 100)
        ' ...
    End Sub
End Class

有关范围的更多信息。请参阅MSDN中的this article。此外,this article看起来也适用。

我不认为在Load事件处理程序中执行该工作有任何特别的错误。只要执行它不需要很长时间,我会说这是一个非常合理的地方。如果确实需要很长时间来运行该代码,出于某种原因,最好在由Shown事件启动的后台工作程序中执行此操作,这样您就不会减慢显示的速度。形式。