![]() |
AW: into Record?
Zitat:
|
AW: into Record?
Mal schnell getestet und natürlich zuerst ein kleines Fehlerchen, mit blöder Auswirkung. (nur die lokalen Variablen wurden freigegeben)
Delphi-Quellcode:
type
TTest = class(TInterfacedObject, ITest) Name: string; constructor Create(Name: string); destructor Destroy; override; end;
Delphi-Quellcode:
type
ITest = interface end; TTest = class(TInterfacedObject, ITest) Name: string; constructor Create(Name: string); destructor Destroy; override; end; class function TTest.Create(Name: string): ITest; begin Result := inherited Create; (Result as TTest).Name := Name; ShowMessage('Start ' + Name); end; destructor TTest.Destroy; begin ShowMessage('Stop ' + Name); inherited; end; procedure TForm11.FormCreate(Sender: TObject); var Var1, Var2, Var3, Var4: ITest; begin Var1 := TTest.Create('Var1'); // Start Var1 var Inline1 := TTest.Create('Inline1'); // Start Inline1 TTest.Create('Temp1'); // Start Temp1 Beep; if Tag = 0 then Var2 := TTest.Create('Var2'); // Start Var2 if Tag = 0 then var Inline2 := TTest.Create('Inline2'); // Start/Stop Inline2 if Tag = 0 then TTest.Create('Temp2'); // Start/Stop Temp2 Beep; if Tag = 0 then begin Var3 := TTest.Create('Var3'); // Start Var3 var Inline3 := TTest.Create('Inline3'); // Start Inline3 TTest.Create('Temp3'); // Start Temp3 end; // Stop Temp3/Inline3 Beep; if Tag = 0 then begin Var4 := TTest.Create('Var4'); // Start Var4 var Inline4 := TTest.Create('Inline4'); // Start Inline4 TTest.Create('Temp4'); // Start Temp4 Beep; begin TTest.Create('Temp5'); // Start Temp5 end; // Stop Temp5 Beep; begin TTest.Create('Temp6'); // Start Temp6 Beep; TTest.Create('Temp7'); // Start Temp7 Beep; end; // Stop Temp7/Temp6 Beep; begin var Temp8 := TTest.Create('Temp8'); // Start Temp8 Beep; Temp8 := TTest.Create('Temp9'); // Stop Temp8 / Start Temp9 Beep; end; // Stop Temp9 Beep; ShowMessage('Show'); // Show Beep; end; // Stop Temp4/Inline4 Beep; end; // Stop Temp1/Inline1/Var4/Var3/Var2/Var1
Delphi-Quellcode:
class function TTest.Create(Name: string): ITest;
begin ShowMessage('Start ' + Name); Result := inherited Create; (Result as TTest).Name := Name; end; begin var Temp8 := TTest.Create('Temp8'); // Start Temp8 Beep; Temp8 := TTest.Create('Temp9'); // Start Temp9 / Stop Temp8 Beep; end; // Stop Temp9 Jo, egal ob mit Begin/End oder nicht ... IF reagiert gleich einheitlich. |
AW: into Record?
Ohhhh, die neuen Custom Managed Records verhalten sich übrigens ganz anders.
Sie werden "sofort" freigegeben, wenn sie nicht mehr benötigt werden ... nicht erst zum Ende des aktuellen Scopes. :shock:
Delphi-Quellcode:
type
TTest = record Name: string; constructor Create(S: string); class operator Implicit(S: string): TTest; class operator Initialize(out Dest: TTest); class operator Finalize(var Dest: TTest); class operator Assign(var Dest: TTest; const [ref] Src: TTest); end; constructor TTest.Create(S: string); begin Name := S; ShowMessage('Create ' + Name); end; class operator TTest.Implicit(S: string): TTest; begin Result.Name := S; ShowMessage('Impicit ' + Result.Name); end; class operator TTest.Finalize(var Dest: TTest); begin ShowMessage('Final ' + Dest.Name); Dest.Name := ''; end; class operator TTest.Initialize(out Dest: TTest); begin Dest.Name := 'Init'; ShowMessage('Init'); end; class operator TTest.Assign(var Dest: TTest; const [Ref] Src: TTest); begin if Dest.Name = 'Init' then ShowMessage('Assign ' + Src.Name) else ShowMessage('Assign ' + Src.Name + '>' + Dest.Name); Dest.Name := Src.Name; end; procedure TForm11.FormCreate(Sender: TObject); var Var1a, Var1, Var2a, Var2, Var3a, Var3, Var4a, Var4: TTest; begin // Init Var1a..Var4 Var1a := 'Var1a'; // Init/Implicit (Temp)Var1a / Assign Var1a / Final (Temp)Var1a Var1 := TTest.Create('Var1'); // Init/Create (New)Var1 / Assign Var1 / Final (New)Var1 var Inline1 := TTest.Create('Inline1'); // Init/Create Inline1 TTest.Create('Temp1'); // Init/Create/Final Temp1 Beep; if Tag = 0 then Var2a := 'Var2a'; // Init/Implicit (Temp)Var2a / Assign Var2a / Final (Temp)Var2a if Tag = 0 then Var2 := TTest.Create('Var2'); // Init/Create (New)Var2 / Assign Var2 / Final (New)Var2 if Tag = 0 then var Inline2 := TTest.Create('Inline2'); // Init/Create/Final Inline2 if Tag = 0 then TTest.Create('Temp2'); // Init/Create/Final Temp2 Beep; if Tag = 0 then begin Var3a := 'Var3a'; // Init/Implicit (Temp)Var3a / Assign Var3a / Final (Temp)Var3a Var3 := TTest.Create('Var3'); // Init/Create (New)Var3 / Assign Var3 / Final (New)Var3 var Inline3 := TTest.Create('Inline3'); // Init/Create Inline3 TTest.Create('Temp3'); // Init/Create/Final Temp3 end; // ###NOT FInal Temp3 / Final Inline3 Beep; if Tag = 0 then begin Var4a := 'Var4a'; // Init/Implicit (Temp)Var4a / Assign Var4a / Final (Temp)Var4a Var4 := TTest.Create('Var4'); // Init/Create (New)Var4 / Assign Var4 / Final (New)Var4 var Inline4 := TTest.Create('Inline4'); // Init/Create Inline4 TTest.Create('Temp4'); // Init/Create/Final Temp4 Beep; begin TTest.Create('Temp6'); // Init/Create/Final Temp6 Beep; TTest.Create('Temp7'); // Init/Create/Final Temp7 Beep; end; // ###NOT Final Temp7/Temp6 Beep; begin var Temp8 := TTest.Create('Temp8'); // Init/Create Temp8 Beep; Temp8 := TTest.Create('Temp9'); // Init/Create (New)Temp9 / Assign Temp9>Temp8 / Final (New)Temp9 Beep; end; // NOT Final (Temp8)Temp9 Beep; ShowMessage('Show'); // Show Beep; end; // ###NOT Final Temp4 / Final Inline4 Beep; end; // ###NOT Final Temp1 / Final Inline1/Var4..Var1a |
AW: into Record?
Kleine Info am Rande:
SmartPascal bzw. DWScript untrstützt sowas in der Art. Das wäre sicher auch eine schöne Sache für Delphianer:
Delphi-Quellcode:
Theoretisch kann man hier mit ( und ) jeden beliebigen Code aufrufen, der einen Wert des Typen TMyInner zurückgibt (oder der implizit dorthin konvertierbar wäre). Das ist schon manchmal ganz geil, weil das haufenweise unnötige Getter bzw. Setter einspart. Gerade bei indizierten Eigenschaften, die ja nunmal gar kein Feldzugriff so in-line erlauben...
TMy = class
FInner: TMyInner; property Prop read (FInner.Value); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 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