By Reference und by Value
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".