THIS

FreeBASIC-Referenz » Alphabetische Befehlsreferenz » T » THIS

Syntax: THIS
Typ: Schlüsselwort
Kategorie: Datentypen

THIS wird in Prozeduren verwendet, die einem UDT (user defined type) fest zugeordnet sind, um auf die Records des UDTs zuzugreifen. Dazu zählen auch Properties, nicht-statische Operatoren sowie CONSTRUCTOR,- und DESTRUCTOR-Prozeduren.

Auf THIS kann mit WITH zugegriffen werden.

Beispiel:

Type myType
Declare Sub MyCall ()

myVar As Integer
End Type

Dim As myType test

'Setze den Record 'myVar' auf 0
test.myVar = 0
Print "'myVar' = "; test.myVar

'Rufe die zugeordnete SUB auf
test.MyCall()

'jetzt ist der 'value' gleich 10
Print test.myVar
Sleep

Sub myType.MyCall ()
this.myVar = 10
End Sub

THIS kann aber auch ausgelassen werden, so funktioniert das Beispiel auch, wenn die Sub so aussieht:

Sub myType.MyCall ()
    myVar = 10
End Sub

Doch was ist, wenn eine globale Variable exakt genauso heißt, wie eine Variable innerhalb meines UDTs, man aber auf die globale zugreifen will? Nun auch dafür gibt es eine Lösung:

Type myType
Declare Sub changeVar ( newValue As Integer )

myVar As Integer = 5 'Initialwert für die lokale Variable
End Type

Dim Shared As Integer myVar 'Damit die globale Variable innerhalb des Unterprogramms der Klasse bekannt ist, muss sie vorher dimensioniert werden

Sub myType.changeVar ( newValue As Integer )
this.myVar = newValue 'verändert die lokale Variable - erkennbar an 'this'
Print this.myVar

myVar = newValue 'verändert auch die lokale Variable - 'this' kann ausgelassen werden
Print myVar


..myVar = newValue 'verändert die globale Variable - die zwei Punkte sorgen dafür, dass der "Scope" der Klasse verlassen wird
Print ..myVar
End Sub

Dim As myType test


test.changeVar(10)
Print myVar 'Ausgabe der globalen Variable

Sleep

Es sei dazu aber gesagt, dass man solche Situationen vermeiden sollte, da einem schnell Fehler unterlaufen und Variablen nicht die erwarteten Werte enthalten, weil statt auf die globale nur die lokale Variable geändert wurde oder umgekehrt.

Eine andere Art der Verwendung von THIS ist die mit Pointern auf Typen. In diesen Fällen darf nicht wie gewohnt mit einem Punkt auf die Variablen zugegriffen werden,

Print this.myVar

sondern mit einem Pfeil.

Beispiel:

Type myType
Declare Sub changeVar ( newValue As Integer )

myVar As Integer = 5 'Initialwert für die lokale Variable
End Type

Sub myType.changeVar ( newValue As Integer )
this.myVar = newValue
Print this.myVar

End Sub

Dim As myType test
Dim As myType Ptr testPtr = @test

testPtr->changeVar(10)

Sleep

Unterschiede zu QB: neu in FreeBASIC.

Unterschiede zu früheren Versionen von FreeBASIC: THIS existiert seit FreeBASIC v0.17.

Unterschiede unter den FB-Dialektformen: THIS ist nur in -lang fb zulässig

Siehe auch:
TYPE (UDT), CONSTRUCTOR, DESTRUCTOR, BASE, PROPERTY