Einzelnen Beitrag anzeigen

Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream

  Alt 12. Mai 2014, 16:44
Nichts.
Änderungen am Inhalt von 'VAR'-Parametern werden nach außen mitgeteilt. Ohne 'VAR' bleibt die Veränderung des Inhaltes transparent, d.h. nichts geht nach außen.

WIE das vom Compiler umgesetzt wird, ist nebensächlich. Klar, er könnte eine Kopie übergeben, aber wenn in der Routine nie etwas verändert wird, war die Kopie überflüssig. Ergo würde vielleicht ein Referenzzähler, oder ein Lazy-Copy mehr bringen, d.h. es wird die Originaladresse übergeben, aber beim ersten Ändern wird eine Kopie angelegt.

Bei einfachen Datentypen wird bei ohne VAR der Wert direkt übergeben, mit Var die Adresse.

Einfaches Beispiel:
Delphi-Quellcode:
Procedure Foo (Bar : Integer);
Begin
  Bar := Bar + 1;
End;
Procedure FooWithVar (Var Bar : Integer);
Begin
  Bar := Bar + 1;
End;
...
  n := 1;
  Foo(n); // die '1' wird auf den Stack gepackt, und logischerweise 'n' nicht verändert
  Assert(n = 1);
  FooWithVar(n); // Die Adresse von 'n' wird auf den Stac gepackt und so kann der Inhalt von 'n' verändert werden
  Assert(n = 2);
Und für Objekte gilt: VAR nur dann, wenn die Instanz umgebogen wird.
Delphi-Quellcode:
Procedure ChangeTheStream (Var aStream : TStream);
Begin
  aStream := TMyStream.Create();
End;
...
  // Autschn. Speicherleck.
  theStream := TFileStream.Create...
  ChangeTheStream (theStream);
  Assert (theStream is TMyStream);
Das Problem beim Objekt-Parameter-VAR ist doch: Wer ist hier eigentlich zuständig für das Freigeben? Normalerweise gilt ja: Der, der die Instanz erzeugt, gibt sie auch wieder frei (produziert sauberen Code). Aber hier ist das nicht klar, wer das macht bzw. wer zuständig ist. Ergo: Finger weg, brauchste nicht.
  Mit Zitat antworten Zitat