![]() |
Klassen: Clear -> Free -> Create?
Ich habe eine Klasse mit ziemlich vielen Feldern, die ich bei einem
Delphi-Quellcode:
alle händisch zurücksetzen müsste.
Clear
Da liegt es nahe, einfach im
Delphi-Quellcode:
ein
Clear
Delphi-Quellcode:
und danach ein
Free
Delphi-Quellcode:
zu schreiben.
Create
Das Free klappt auch, aber wenn ich danach
Delphi-Quellcode:
schreibe, dann meint der Compiler, "Self" würde nie benutzt.
Self := TDingsbums.Create
Spaßeshalber habe ich mal versucht, eine Instanz einfach in einer ihrer Methoden freizugeben und wieder zu erzeugen. Also ungefähr so:
Delphi-Quellcode:
Zu meinem Erstaunen scheint das zu funktionieren.
TCorona = class(TObject)
procedure VirusBeißtZu; end; var Corona:TCorona; ... procedure TCorona.VirusBeißtZu; begin Corona.Free; Corona := TCorona.Create; end; Was ist von alledem zu halten? |
AW: Klassen: Clear -> Free -> Create?
Es ist eigentlich ganz einfach.
Du hast eine globale Variable, der Du letztlich eine neu erzeugte Instanz zuweist. Insofern nichts besonderes. Die Prozedur hast Du allerdings als Methode angelegt. Insofern muss erst mal eine Instanz erzeugen damit Du die Methode korrekt ausführen kannst. Du könntest die Methode alternativ als Klassenmethode (class procedure ...) anlegen, damit Du sie immer aufrufen kannst. Oder Du erzeugst einfach eine ganz normale Prozedur (nicht als Teil einer Klasse), in der Du die neue Instanz erzeugst und zuweist. Du kannst damit halt immer nur eine globale Variable neu zuweisen. Du könntest auch eine Prozedur erstellen und eine Variable als var-Parameter übergeben und dieser eine neue Instanz zuweisen. Da gibt es unterschiedliche Möglichkeiten - ABER ... ... die Klasseneigenschaften einfach in einer Methode "Clear" aufzuräumen ist m.E. der beste Weg. Die anderen Lösungen empfinde ich als unnötig komplitziert und unübersichtlich. Für das Zurücksetzen von Eigenschaften bietet sich eine Methode Clear oder Init doch nahezu an. |
AW: Klassen: Clear -> Free -> Create?
Self ist nur ein interner einfacher Parameter, der keine Referenz auf die externe Variable besitzt, daher ist das so nicht möglich.
Delphi-Quellcode:
Und "leider" ist es nicht möglich die Übergabe zu beeinflussen,
procedure TCorona.VirusBeißtZu(Self: TCorona); // intern ist das Self
begin Self.Free; Self := TCorona.Create; end; //Corona.VirusBeißtZu; TCorona.VirusBeißtZu(Corona); drum ist FreeAndNil auch eine Prozedur und kann micht ebenfalls als Methode implementiert werden, so wie das Free. Man könnte jetzt in das Speichermanagement eingreifen und nach dem Free das neue Objekt an der "selben" Speicheradresse erzeugen. Da dann beide Objekte an der selben Stelle liegen, zeigt die externe Variable immernoch auf die "richtige" Stelle. Bei Multithread kann es aber schief geh. Dann gäbe es noch die RTTI, mit welcher man alle Felder durchlaufen und freigeben könnte. Oder man verschiebt die Daten.
Delphi-Quellcode:
bzw.
type
TFoo = class(TObject) FData: record i: Integer; S: string; A: TArray<Integer>; end; procedure Clear; end; procedure TFoo.Clear; begin Finalize(FData); FillChar(FData, SizeOf(FData), 0); // oder ZeroMemory(@FData, SizeOf(FData)); ... was man halt mag end; // oder besser procedure TFoo.Clear; begin Finalize(FData); // gibt nur den Inhalt frei, z.B. von Strings, aber ohne die Variable selbst zurückzusetzen. FillChar(FData, SizeOf(FData), 0); Initialize(FData); // Initialisiert nur gemanagte Typen mit 0, also Strings, Variants, dynamische Array, gen. Methoden-Zeiger und IInterface, daher vorher das FillChar/ZeroMemory end; FinalizeRecord aka FinalizeArray mit Lenght=1 und InitializeRecord aka InitializeArray mit Lenght=1 Das sind auch die Methoden, welche Delphi benutzt, um globale Variablen, lokale Variablen (das was im BEGIN und END der Methode aufgerufen wird) und den Inahlt von Objekten zu initialisieren und freizugeben. |
AW: Klassen: Clear -> Free -> Create?
Moin...:P
Die eigentliche Frage ist nicht beantwortet... Zitat:
Wenn mir ein simpler Vergleich einfällt, lasse ich es euch wissen...:zwinker: |
AW: Klassen: Clear -> Free -> Create?
[Offtopic]
Wenn der Baron von Münchhausen eine solche Phönix-Klasse entwickelt, könnte es vielleicht funktionieren, aber im realen Leben ist das eine schlechte Idee. [/Offtopic] Anders sieht das aus, wenn das Clear von aussen aufgerufen wird, denn dann kann man auch von aussen stattdessen das Objekt freigeben und neu erstellen. |
AW: Klassen: Clear -> Free -> Create?
Zitat:
Im NextGen funktioniert es nichtmal, da du das Ojekt garnicht freigeben kannst, so lange noch andere Referenzen existieren, und selbst wenn man es schafft, würde man dadurch eventuelle Weak-Referenzen schrotten. (auf nil setzen) |
AW: Klassen: Clear -> Free -> Create?
Zitat:
|
AW: Klassen: Clear -> Free -> Create?
Zitat:
|
AW: Klassen: Clear -> Free -> Create?
next-gen ist tot
(previous-gen fomerly known as next-gen) |
AW: Klassen: Clear -> Free -> Create?
dann halt MobileDingsabums ... das mit dem ARCZeugs
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00: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-2025 by Thomas Breitkreuz