这似乎是一个简单的问题,但我很难学习它。
我有一个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
事件处理程序中使用数组是一种很好的做法吗?
答案 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
事件启动的后台工作程序中执行此操作,这样您就不会减慢显示的速度。形式。