Self ist nur ein interner einfacher Parameter, der keine Referenz auf die externe Variable besitzt, daher ist das so nicht möglich.
Delphi-Quellcode:
procedure TCorona.VirusBeißtZu(Self: TCorona); // intern ist das Self
begin
Self.Free;
Self := TCorona.Create;
end;
//Corona.VirusBeißtZu;
TCorona.VirusBeißtZu(Corona);
Und "leider" ist es nicht möglich die Übergabe zu beeinflussen,
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:
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;
bzw.
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.