Nur mal so am rande bedeutet das, dass folgendes das selbe macht
Nö - probier's doch einfach mal aus. Bei Fall 2 wird zwar innerhalb von KeyFooVal die Kopie "arr" verändert, nicht aber das Original "Keys" aus Main.
So sieht man's vielleicht deutlicher:
Delphi-Quellcode:
procedure Main;
var
Keys: TStringDynArray;
procedure KeyFooRef(var arr: TStringDynArray); //MIT VAR
begin
Setlength(arr, 4);
arr[0] := 'Das';
arr[1] := 'ist';
arr[2] := 'ein';
arr[3] := 'Test';
end;
procedure KeyFooVal(arr: TStringDynArray); // OHNE VAR
begin
Setlength(arr, 4);
arr[0] := 'Das';
arr[1] := 'ist';
arr[2] := 'ein';
arr[3] := 'Test';
end;
procedure Raus(AIndex: Integer; const arr: TStringDynArray);
var
i: Integer;
begin
Write(AIndex, ':');
for i := Low(arr) to High(arr) do
Write(' ', arr[i]);
Writeln;
end;
begin
Raus(1, Keys);
KeyFooRef(Keys); //Fall 1
Raus(2, Keys);
Keys := nil;
Raus(3, Keys);
KeyFooVal(Keys); //Fall 2
Raus(4, Keys);
end;