![]() |
AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream
@OlafSt
Wenn ich dir meinen Schlüssel zu meiner Wohnung gebe, dann kannst du in die Wohnung rein und dort umräumen. Tauscht du den Schlüssel nun aus und gibts mir diesen zurück, komme ich nicht mehr in meine Wohnung.
Delphi-Quellcode:
Gebe ich dir eine Kopie meines Schlüssels, dann kannst du immer noch in die Wohnung rein und umräumen.
procedure Foo( var AKey : TWohnung );
Da ich aber keinen Schlüssel von dir zurücknehme, kann ich trotzdem noch mit meinem Schlüssel in meine Wohnung (und sehe dann entweder Chaos oder endlich mal eine aufgeräumte Wohnung)
Delphi-Quellcode:
procedure Foo( AKey : TWohnung );
|
AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream
...oder eine leere wohnung :lol:
Ich persönlich habe das ganze ja schon länger verstanden (auch wenn ich der Ansicht bin, das CONST nun mal CONST ist, auch Eigenschaften sollten dann unveränderlich sein). Ich hoffe, der TE bekam nun seine Antwort ;) |
AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream
Zitat:
(Es wird ja gar nicht die Instanz übergeben, nur der Weg, wie ich dort hinkomme und bei
Delphi-Quellcode:
kann ich den Weg auch gar nicht ändern)
const
|
AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream
Zitat:
Besser kann man es nicht erklären. :thumb: Da solltest du dir ein Patent drauf geben lassen. |
AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream
Zitat:
Sir Rufo hat es genau richtig beschrieben.:idea: |
AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream
Zitat:
Wenn ich an der Kopie des Schlüssels etwas ändere (Eigenschaft: Farbe, oder Form), dann ist bei
Delphi-Quellcode:
dann ist doch auch der Original-Schlüssel geändert, richtig?
procedure Foo( AKey : TKey );
Gibt es eine Möglichkeit (gibt es überhaupt Situationen) wo das Objekt vollkommen als Kopie übergeben wird?? Ist das Verhalten in .Net das selbe? |
AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream
Zitat:
In .NET ist das Verhalten soweit ich weiß das selbe. |
AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream
Danke an alle schon Mal :-)
Ich habe verstanden wie sich ein Objekt als Parameter verhaltet :-) Ziel erreicht! |
AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream
Zitat:
Es wird eben nicht die Instanz übergeben, sondern eine Referenz/Zeiger/Pointer (wie auch immer du das definieren willst) auf die Instanz. Zitat:
Und selbst wenn du in dem Falle den Wert von
Delphi-Quellcode:
änderst, dann wird der Wert von
AKey
Delphi-Quellcode:
procedure Foo( AKey : TWohnung );
begin AKey := TWohnung.Create; // In AKey steht jetzt der Wert $22222222 end; procedure Bar; var LKey : TWohnung; begin LKey := TWohnung.Create; // <-- In LKey steht jetzt z.B. der Wert $11111111 Foo( LKey ); // LKey hat jetzt immer noch den Wert $11111111 end;
Delphi-Quellcode:
nicht geändert.
LKey
|
AW: Unterschied zwischen (var AFileStream: TFileStream) und (AFileStream: TFileStream
Holen wir mal ein bisschen aus:
Delphi-Quellcode:
Dingens ist also ein Zeiger auf die Instanz, die mit dem Create-Aufruf angelegt wurde.
procedure TfrmSchiessMichTot.MachWas;
var //Instanzvariable Dingens: TDingens; begin //Erzeugen der Instanz und Ablegen in der Variablen (intern ein Zeiger) Dingens := TDingens.Create;
Delphi-Quellcode:
Folgender Code schadet also nicht, da er nur die Kopie betrifft:
procedure MachDingens(ADingens: TDingens);
//ADingens ist hier eine Kopie der ursprünglichen Instanzvariablen, //zeigt aber somit auch auf dieselbe Instanz, daher lässt sich darüber auf //deren Methoden und Eigenschaften zugreifen
Delphi-Quellcode:
procedure MachDingens(ADingens: TDingens);
begin ADingens := TDingens.Create;
Delphi-Quellcode:
Weist man hier nun dem Parameter einen neuen Wert zu, betrifft das auch die Originalvariable, die somit in der aufrufenden Routine nicht mehr erreichbar ist. Bestenfalls bewirkt das lediglich ein Speicherleck, kann aber auch sehr viel schlimmer ausgehen.
procedure MachDingens(var ADingens: TDingens);
//Hier handelt es sich um die Original-Instanzvariable. Überschreibt man die, //hat man auch in der aufrufenden Routine keinen Zugriff mehr auf die //ursprüngliche Instanz |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 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 by Thomas Breitkreuz