AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream)
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von michele_tedesco · begonnen am 12. Mai 2014 · letzter Beitrag vom 14. Mai 2014
 
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
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz