By Reference und by Value

Aus Wiki des Deutschsprachige Xbaseentwickler e. V.
Zur Navigation springen Zur Suche springen

Parameter-Übergabe

Es liegt in der Natur von Variablen, dass sie auch an andere Funktionen übergeben werden. Grundsätzlich werden Variablen in diesen Fällen "per Value" übergeben, d.h. es wird Link auf eine Kopie der Variablen an die Funktion weitergeleitet.


per value

Eine Veränderung der Variablen in der Funktion wirkt somit nur auf die Kopie und nicht auf die ursprüngliche Variable:

FUNCTION Main()
   Local dDate
   dDate := Date()
   ? dDate
   ChangeMe(dDate)
   ? dDate
RETURN(.T.)
FUNCTION ChangeMe(dDate)
   ? dDate
   dDate ++
   ? dDate
RETURN(.T.)

Diese Ausgabe dieses kleinen Programms sieht so aus:

29.05.2013 (aus Main())
29.05.2013 (aus ChangeMe())
30.05.2013 (aus ChangeMe())
29.05.2013 (aus Main())

Die Änderung, die in ChangeMe() an dDate vorgenommen wurde, verändert nur eine (temporäre) Kopie, aber nicht die Original-Variable in Main().

Es gibt aber Situationen, in denen genau diese Änderung erwünscht ist, und dann muss eine Variable "per Reference" übergeben werden.


per reference

Die Übergabe "per Reference" gibt keinen Link auf eine Kopie, sondern einen Link auf die Variable an die aufgerufene Funktion weiter. Um das zu erreichen, muss ein Parameter mit dem @ Zeichen eingeleitet werden:

FUNCTION Main()
   Local dDate
   dDate := Date()
   ? dDate
   ChangeMe(@dDate)
   ? dDate
RETURN(.T.)
FUNCTION ChangeMe(dDate)
   ? dDate
   dDate ++
   ? dDate
RETURN(.T.)

Jetzt sieht die Ausgabe dieses kleinen Programms so aus:

29.05.2013 (aus Main())
29.05.2013 (aus ChangeMe())
30.05.2013 (aus ChangeMe())
30.05.2013 (aus Main())

Die Änderung in ChangeMe() wurde nicht an einer Kopie, sondern an der ursprünglichen Variablen durchgeführt.


Ausnahmen von der Regel

Arrays und Objekte werden immer "per Reference" übergeben, so dass Änderungen, die in der aufgerufenen Funktion an einem so übergebenen Array oder Objekt vorgenommen werden, sich immer auch auf das ursprüngliche Objekt auswirken.


Arrays als normale Parameter

Wenn ein Array als Parameter übergeben wird, erhält die aufgerufene Funktion eine Referenz auf das Array und kann das Array verändern.


Arrays als Parameter mit dem @ Operator

Der @ Operator kehrt das Verhalten um: jetzt wird ein Array per Value übergeben, d.h. die aufgerufene Funktion erhält eine Kopie des Arrays, und Änderungen schlagen nicht auf das ursprüngliche Array durch.


Array-Elemente als Parameter

Ist das betreffende Element selbst ein Array oder ein Objekt, wird es "per Reference" übergeben, andernfalls "per Value".