Zu
Zitat:
Das stimmt nicht ganz. Mit der Zuweisung wird zunächst nur der Referenzzähler des Strings erhöht. Erst wenn eine Änderung in Result erfolgt wird ein neuer String angelegt und der Inhalt kopiert.
Bei mir ist das anders.
Delphi-Quellcode:
PROCEDURE TMain.Test;
var S,R,Res:String; I:Nativeint;
begin
S:='Delphi-Praxis';
R:='aie';
Res:=RemoveCharsEx('Delphi-Praxis','aie');
end;
In diesem Fall hast du wohl Recht - allerdings nur, weil der Source-String hier eine Stringkonstante ist. Auch wenn man beim Aufruf die Variablen S und R benutzt (ich vermute das war deine Absicht), bekommt man das gleiche Verhalten, da der Rückgabewert einer Funktion immer ein referenz-gezählter String ist (eben keine Konstante).
Das ist allerdings ein Sonderfall, der (vermutlich) in der praktischen Anwendung der Funktion kaum zum Tragen kommt. Du kannst ja mal den folgenden Code durch den Debugger laufen lassen:
Delphi-Quellcode:
function RemoveCharsEx(const S, Chars: string): string;
begin
result := S;
end;
procedure Main;
var
S, R, Res: String;
begin
S := 'Delphi-Praxis'; // Referenzzähler = -1
R := 'aie';
S := S + S; // Referenzzähler = 1
Res := RemoveCharsEx(S, R);
end;
Sowohl unter XE2 als auch XE7 wird bei der Zuweisung lediglich der Referenzzähler erhöht.