2014-04-16 3 views
2

간단한 질문 인 것 같습니다. 그러나 배우는 데 어려움을 겪고 있습니다.여러 가지 방법으로 사용할 수있는 객체를 만드는 방법

나는 VB.NET Windows Forms 응용 프로그램이 있습니다. 응용 프로그램이로드 될 때 airplane 클래스의 몇 가지 객체를 만들고 배열에 저장하여 다른 하위 및 함수가 함께 작동 할 수있게하려고합니다. 그러나이 배열을 private로만 설정할 수 있으므로 나중에 더 이상 사용할 수 없습니다.

'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 

을 그리고 I는 다음과 같이 나중에 배열을 사용하려면 :

나는이 같은 개체를 만드는 오전

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 

내가받을 다음과 같은 오류 :

"plane" is not declared or can't be accessed.

하지만 "평면"을 공개로 설정할 수는 없습니다. 또한, Load 이벤트 핸들러에서 배열을 사용하는 것이 좋습니다.

답변

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 이벤트로 시작된 백그라운드 작업자에서 수행하여 양식 표시 속도를 늦추지 않는 것이 좋습니다.

1

변수 비행기을 Form1_Load 메서드에 정의 했으므로이 필드에서만 액세스 할 수 있습니다. 다른 방법에서 그것의 액세스를 원한다면 당신이를 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 
관련 문제