TStringList als var Parameter?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
KreuzBlick
Beiträge: 36
Registriert: Fr 3. Mai 2019, 17:45
OS, Lazarus, FPC: Win8.1 (L 2.2.4 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Saarland

TStringList als var Parameter?

Beitrag von KreuzBlick »

Hallo,

ich habe mal eine eher theoretische Frage. Mal angenommen, ich will ein Objekt vom Typ TStringlist in einer Prozedur bearbeiten und bearbeitet zurückbekommen. Muss ich dann der Prozedur die Variable als var-Parameter übergeben oder geht es auch als Wertparameter?
Ich frage deshalb, weil der Prozedur in beiden Fällen ein Zeiger übergeben wird. Wenn dieser nicht geändert wird, sondern nur der Speicher auf den gezeigt wird, so kommt das Ergebnis doch in beiden Fällen im aufrufenden Programmteil an.
Was ist also zu empfehlen?
Viele Grüße
Gerold

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TStringList als var Parameter?

Beitrag von theo »

Ja, du brauchst dafür keinen var Parameter.
Es gibt aber schon einen Unterschied.

Testen Sie selbst:

Code: Alles auswählen

procedure TesteVar(var AList: TStringList);
begin
  AList:=TStringList.Create;
  AList.Add('testen var');
end;

procedure Teste(AList: TStringList);
begin
  AList:=TStringList.Create;
  AList.Add('testen');
end;

procedure TForm1.Button1Click(Sender: TObject);
var Ast:TStringList;
begin
  Ast:=TStringList.Create;
  TesteVar(Ast);
  Teste(Ast);
  Memo1.Text:=Ast.Text;
end;  
Im "richtigen Leben" noch auf den Speicher achten! :wink:

PascalDragon
Beiträge: 830
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: TStringList als var Parameter?

Beitrag von PascalDragon »

KreuzBlick hat geschrieben:
Mi 9. Sep 2020, 16:08
Hallo,

ich habe mal eine eher theoretische Frage. Mal angenommen, ich will ein Objekt vom Typ TStringlist in einer Prozedur bearbeiten und bearbeitet zurückbekommen. Muss ich dann der Prozedur die Variable als var-Parameter übergeben oder geht es auch als Wertparameter?
Ich frage deshalb, weil der Prozedur in beiden Fällen ein Zeiger übergeben wird. Wenn dieser nicht geändert wird, sondern nur der Speicher auf den gezeigt wird, so kommt das Ergebnis doch in beiden Fällen im aufrufenden Programmteil an.
Was ist also zu empfehlen?
Für Klasseninstanzen musst du var (oder auch out) für Parameter nur benutzen, wenn du die Instanz ändern möchtest (also zum Beispiel du aVarArg := TStringList.Create). Ansonsten reicht es einen normalen by-Value Parameter zu nutzen. Selbst const oder noch schlimmer constref ist dafür nicht nötig.
FPC Compiler Entwickler

Antworten