Referenzvariablen und Objekte an anderer Stelle in einem Formular

Ich versuche, ein Ausrüstungsobjekt an ein Formularobjekt zu übergeben und dieses Ausrüstungsobjekt dann in einem Klickereignis von einer Schaltfläche in dem Formular zu verwenden. Aber ich weiß nicht, wie ich das Ausrüstungsobjekt innerhalb des Button-Ereignisses richtig referenzieren soll.

Ich richte die neue Formularinstanz wie folgt ein:

Public Sub New(ByRef thisEquip As classEquipment) Me.InitializeComponent() Me.Text = thisEquip.equipName & " Tests" End Sub 

und richte das Button-Click-Ereignis wie folgt ein:

 Private Sub btnUpdateAndClose_Click(sender As Object, e As EventArgs) Handles btnUpdateAndClose.Click Call updateTestList(thisEquip) End Sub 

Aber das Objekt ‘thisEquip’ wird nicht erkannt. Ich denke, das liegt daran, dass der Absender der Button und nicht das Formular selbst ist. Ich weiß jedoch nicht, wie ich das Ausrüstungsobjekt aus dem Formular referenziere.

Der Gültigkeitsbereich hängt davon ab, wo eine Variable deklariert ist. Sie haben möglicherweise etwas übersehen, das den Link überfliegt – jede Zusammenfassung auf scopesebene enthält die Phrase, in der sie deklariert ist .

Nun schau dir deinen Konstruktor an:

 Public Sub New(ByRef thisEquip As classEquipment) 

thisEquip wird als Argument für den Konstruktor deklariert . Daher existiert es nur in diesem Verfahren. Die Tatsache, dass das Verfahren in einer Form ist oder dass dieses thisEquip in der Form (oder Modul oder irgendetwas anderes) erwähnt wird, ist nebensächlich. Zwar ist der Konstruktor in mehrfacher Hinsicht etwas Besonderes, aber in Sachen Scope ist es nur ein anderes Verfahren.

Form Level scope

So speichern Sie eine Referenz für die Verwendung an anderer Stelle:

 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 

Auf Formularebene angegeben, hat es einen Bereich auf Formular- / classnebene. Sie können myEquip oder myImgs jetzt überall im Formular referenzieren. Verwenden Sie Dim wenn Sie nur einem Objekt auf Formularebene etwas zuweisen – es wird eine neue lokale Variable mit identischem Namen erstellt.


Andere übliche scopesebenen:

Geltungsbereich der Prozedur

 Private myFoo as Int32 Private Sub DoSomething() Dim myBar As String myBar = "Ziggy" ... Dim myFoo As Int32 = 7 End Sub 

Dies wird häufiger als lokaler Geltungsbereich bezeichnet . Ich verwende Prozedure Level, weil es besser mit den anderen Begriffen vergleicht und kontrastiert.

myBar wird in der DoSomething Methode DoSomething , daher hat es den scope der Prozedurstufe – es existiert nur in dieser Methode. Der Versuch, sie an anderer Stelle zu verwenden, führt zu einem Fehler. Dies ähnelt dem obigen Beispiel des Konstruktors, mit dem Hauptunterschied, dass das Objekt thisEquip als Parameter übergeben und nicht lokal deklariert wurde.

Dies führt dazu, dass einige verwirrt werden: Das Dim myFoo in der Methode deklariert (erzeugt!) Eine neue, nur lokale myFoo Variable, die keine Beziehung zu der gleichnamigen Form / classn-Variablen hat. Die lokale Version überschattet die andere. Ein Teil der Verwirrung scheint darin zu liegen, dass einige denken, dass sie Dim (wieder) benutzen müssen, bevor sie eine Variable benutzen können. Sie____ nicht.


Block Level scope

Direkt von MSDN:

 If n < 1291 Then Dim cube As Integer cube = n ^ 3 End If 

Eine beträchtliche Anzahl von VB-statementen erstellt einen Blockbereich ( For Each / Next , If / End If und Using / End Using ). Variablen, die innerhalb eines Blocks deklariert sind, haben einen auf diesen Block beschränkten Bereich. Im Grunde erzeugt (fast) alles, was zu einem Einzug führt, einen Blockbereich.

 Private Sub ..... Dim cube As Int32 If n < 1291 Then cube = n ^ 3 End If 

Jetzt kann cube anderer Stelle in der Prozedur verwendet werden: Der Bereich wurde von Block zu Lokal geändert.

Weitere Informationen finden Sie unter MSDN:
- Bereich in Visual Basic
- Werttypen gegenüber Referenztypen