![]() |
AW: Generics - Pro und Contra
D.h.
Delphi-Quellcode:
Erzeugt doppelten Code?
Var
foo : TList<TBar>; ... Var bar : TList<TBar>; Dann muss man also
Delphi-Quellcode:
Schreiben und die Welt ist in Ordnung?
Type TBarList = TList<TBar>;
Var foo : TBarList; ... Var bar : TBarList; |
AW: Generics - Pro und Contra
Ich habe mich damit nie befasst, aber soweit ich es verstanden habe erzeugt folgendes einmal Code für eine Integer-Liste und einmal Code für eine TObject-Liste:
Delphi-Quellcode:
Stevie hat da neulich nochmal zu geschrieben:
var
myIntegerList: TList<Integer>; myObjectList: TList<TObject>; Zitat:
![]() |
AW: Generics - Pro und Contra
Zitat:
Zu dem Pack: Also das ist schon ein komisches Zeug, denn der Code wird in den Units garnicht aufgerufen. Und das Left/Right in der Methode ist nirgendwo definiert. (ist wohl Compiler-Magic?) Und scheint es nur so, oder kann in einer generischen TList<> eventuell kein NIL-Objekt abgelegt werden, da Pack dafür da ist, um die zu entfernen? [add] Aber das funktioniert nicht, drum knallt es. Als TList>TObject> funktioniert folgender Code, aber als TObjectList<TObject> macht es bumm.
Delphi-Quellcode:
var
L: TList<TObject>; begin L := TObjectList<TObject>.Create; //List<TObject>.Create; ShowMessage(IntToStr(L.Count)); L.Add(nil); ShowMessage(IntToStr(L.Count)); L.Add(Self); ShowMessage(IntToStr(L.Count)); L.Add(Self); ShowMessage(IntToStr(L.Count)); L.Add(nil); ShowMessage(IntToStr(L.Count)); L.Remove(Self); ShowMessage(IntToStr(L.Count) + ' ' + IntToStr(L.IndexOf(Self))); L.Delete(L.IndexOf(Self)); // bei TObjectList knallt es hier ShowMessage(IntToStr(L.Count)); L.Free; end; |
AW: Generics - Pro und Contra
Zitat:
War mir noch gar nicht aufgefallen. Das ist m.E. das erste mal, dass ich gezwungen bin, ein Interface zu benutzen. (Ich würde das jetzt weder als besonders positiv oder negativ bewerten, aber eben ungewohnt ... und zu (meinem) üblichen Programmierstil inkonsistent.) |
AW: Generics - Pro und Contra
Zitat:
Delphi-Quellcode:
für ein
T.Something
Delphi-Quellcode:
schreibst, das keinen Constraint hat...
T
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
in Verbindung mit Generics korrigieren)
class var
Gruß, Sven |
AW: Generics - Pro und Contra
Zitat:
Zitat:
Mein Patch funktioniert übrigens nur rudinemtär mit XE2, weil ich "gestoppt wurde". |
AW: Generics - Pro und Contra
Zitat:
In Delphi gibt es aber sehr wohl ![]() Zitat:
Dieser Code:
Delphi-Quellcode:
Führt zu diesem Assembler Code in XE6:
program Project1;
{$APPTYPE CONSOLE} type TEnumerator = class fCurrent: Integer; function MoveNext: Boolean; property Current: Integer read fCurrent; end; TEnumerable = class function GetEnumerator: TEnumerator; end; function TEnumerable.GetEnumerator: TEnumerator; begin Result := TEnumerator.Create; end; function TEnumerator.MoveNext: Boolean; begin Inc(fCurrent); Result := fCurrent < 10; end; var e: TEnumerable; i: Integer; begin for i in e do Writeln(i); Readln; end.
Code:
Wie man sehen kann, stehen da sowohl die Zeile mit der Schleife als auch der einzeilige Rumpf zweimal drin. Daher stoppt der Debugger auch 2mal hintereindner in der Schleifenzeile beim Start (1. GetEnumerator 2. MoveNext) und noch einmal im Rumpf nachdem der letzte Aufruf von MoveNext false geliefert hat um den Enumerator aufzuräumen.
Project9.dpr.36: for i in e do
0041C454 A1BC3E4200 mov eax,[$00423ebc] 0041C459 E876D8FFFF call TEnumerable.GetEnumerator 0041C45E 8945EC mov [ebp-$14],eax 0041C461 33C0 xor eax,eax 0041C463 55 push ebp 0041C464 68C5C44100 push $0041c4c5 0041C469 64FF30 push dword ptr fs:[eax] 0041C46C 648920 mov fs:[eax],esp 0041C46F EB25 jmp $0041c496 0041C471 8B45EC mov eax,[ebp-$14] 0041C474 8B4004 mov eax,[eax+$04] 0041C477 A3C03E4200 mov [$00423ec0],eax Project9.dpr.37: Writeln(i); 0041C47C A18CE64100 mov eax,[$0041e68c] 0041C481 8B15C03E4200 mov edx,[$00423ec0] 0041C487 E8E08CFEFF call @Write0Long 0041C48C E8BB8FFEFF call @WriteLn 0041C491 E8D27BFEFF call @_IOTest Project9.dpr.36: for i in e do 0041C496 8B45EC mov eax,[ebp-$14] 0041C499 E856D8FFFF call TEnumerator.MoveNext 0041C49E 84C0 test al,al 0041C4A0 75CF jnz $0041c471 0041C4A2 33C0 xor eax,eax 0041C4A4 5A pop edx 0041C4A5 59 pop ecx 0041C4A6 59 pop ecx 0041C4A7 648910 mov fs:[eax],edx 0041C4AA 68CCC44100 push $0041c4cc Project9.dpr.37: Writeln(i); 0041C4AF 837DEC00 cmp dword ptr [ebp-$14],$00 0041C4B3 740F jz $0041c4c4 0041C4B5 B201 mov dl,$01 0041C4B7 8B45EC mov eax,[ebp-$14] 0041C4BA 8B08 mov ecx,[eax] 0041C4BC FF51FC call dword ptr [ecx-$04] 0041C4BF 33C0 xor eax,eax 0041C4C1 8945EC mov [ebp-$14],eax 0041C4C4 C3 ret 0041C4C5 E90EA0FEFF jmp @HandleFinally 0041C4CA EBE3 jmp $0041c4af Zitat:
Delphi-Quellcode:
und
TList<TBar>
Delphi-Quellcode:
obwohl der identisch ist. Übrigens ist
TList<TFoo>
Delphi-Quellcode:
kein neuer Typ sondern nur ein Alias. In 2009 oder 2010 hätte es das Problem gelöst, glaube ich - aber sicher bin ich da nicht mehr.
type TBarList = TList<TBar>;
Zitat:
|
AW: Generics - Pro und Contra
Also bei uns schaut der Code mit Generics auch gleich viel sauberer aus, als ohne. Vorher haben wir im Grunde immer eine Objectlist genommen und dann wild gecastet. Das ist doch jetzt sehr viel hübscher.
|
AW: Generics - Pro und Contra
Zitat:
Wenn ich jetzt aber sehe, dass ich meine Container (Maps, Multimaps, ...) ganz klassisch schneller, kleiner und einfacher hinbekomme, fällt es mir nicht wirklich schwer auch ganz auf Generics zu verzichten. Ein simpler Typsicherer Wrapper für eine TObjektList mag noch ok sein, aber das reicht dann schon. Komplexere Konstrukte gehören für mich in einen Code-Generatoren (mit so vielen Parametern und Einstellungsmöglichkeiten wie man will) oder Metasprachen (die nach Pascal compilieren). Man muss dafür nicht auch noch die ohnehin schon überladene Pascal-Syntax quälen. |
AW: Generics - Pro und Contra
Zitat:
Aber das ist ja nur der kleinste Teil der Vorteile von Generics. Allerdings sieht man oft die Möglichkeiten gar nicht. Das sieht man relativ oft, wenn jemand Generics noch nicht oft benutzt hat. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 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