![]() |
AW: Operator Overloading for CLASSES (not records!)
Wenn ich mal zusammenfassen darf: die Möglichkeit Operatoren zu überladen, ist wohl nur auf reinen ARC-Systemen möglich, sehe ich das jetzt richtig? Für nonArc-Systeme, also solche, bei denen man einen richtigen GC bräuchte oder aber selbst alle Objekte wieder frei gibt, ist das nicht realisierbar?
|
AW: Operator Overloading for CLASSES (not records!)
Zitat:
|
AW: Operator Overloading for CLASSES (not records!)
Klassen sind keine Records, und Records sind keine Klassen. Nur weil eine Klasse Felder wie ein Record hat und somit ein Teil ihres Speicherlayouts dem eines Records gleicht, macht es das nicht zum Record oder könnte gar dessen Funktionalitäten übernehmen - auch wenn intern für einige Dinge vom Compiler generierte record type Info genutzt wird (um zum Beispiel Felder für managed types korrekt zu finalisieren).
Klassen sind Referenztypen (Zeiger auf idR heapallokierten Speicher) und Records sind Wertetypen. Ja, man kann Zeiger auf Records haben und sie auch selbst aufm Heap allokieren, aber dann hantiert man nunmal mit Zeigern, also einem Referenztyp auf einen Wertetypen. Records und die Operatoren, welche einen Record zurück geben arbeiten idR mit CopyRecord und der Standardmechanismus für Methoden, die einen Record zurückliefern, finden statt - Keine Heapallokation. Ein Operator, der Objekte zurückgeben würde, müsste eine Heapallokation durchführen. Generell noch kein Problem, aber wenn man zum Beispiel den Code
Delphi-Quellcode:
hat, wird dort mind ein Temp Wert erzeugt (entweder a+b oder b+c) und erst das ergebnis dieses Temp Wertes mit dem dritten Wert landet in x, bei einer Heapallokation -> Speicherleck.
x := a + b + c;
|
AW: Operator Overloading for CLASSES (not records!)
Zitat:
|
AW: Operator Overloading for CLASSES (not records!)
Zitat:
Was mich an der Sache hier viel mehr interessiert hat waren überladene Operatoren in Record Helpers. Das wäre wirklich eine nützliche Sache. Denn damit könnte man das Standardverhalten für einfache Typen lokal übersteuern. Beispiel:
Delphi-Quellcode:
das wäre doch viel übersichtlicher als komplexe if-or-or-or-then-Konstrukte. Noch besser wäre natürlich, wenn case auch mit Strings umgehen könnte:
var
S: string; begin S := 'foo'; if S in ['foo', 'bar'] then begin {...} end; end;
Delphi-Quellcode:
Für case-Anweisungen fehlt irgendwie ein überladbarer Operator. Equality spielt da zwar mit rein, aber case an sich ist nicht flexibel genug. Da ist switch-case in anderen Sprachen (z.B. Javascript, PHP) deutlich komfortabler.
var
S: string; begin S := 'foo'; case S of 'foo': {...} 'bar': {...} end; end; |
AW: Operator Overloading for CLASSES (not records!)
Ich bin froh, dass das nicht geht. Das verhindert damit oft unsauberen Code. (Wegen SoC
![]() |
AW: Operator Overloading for CLASSES (not records!)
Zitat:
|
AW: Operator Overloading for CLASSES (not records!)
Zitat:
Zitat:
![]() ![]() Bzgl Verbesserung des case of Statements: einfach mal nen Vote für ![]() |
AW: Operator Overloading for CLASSES (not records!)
Zitat:
|
AW: Operator Overloading for CLASSES (not records!)
Nativ fehlt halt so Einiges in Delphi, was man schonmal gebraucht hätte. (Einiges gibt es zum Glück von Fremdanbietern, was aber auch schnell den Gesamtpreis von Delphi etwas in die Höhe treibt)
DefaultPropery für Strings (das mit dem Default-Attritut ist schon blöd, denn Eines steht davor und das Andere dahinter und wenn ich jetzt frage wer von euch überhaupt weiß dass es sowas gibt, dann hebt bestimmt kaum jemand die Hand), Attribute hinter dem was man beschreiben will (statt davor/drüber), kleine Makros, assoziative Arrays, ein besseres CASE, ... Nicht schön, aber was soll's.
Delphi-Quellcode:
case IndexStr(S, ['A', 'B', 'C']) of
0{A}: ...; 1{B}: ...; 2{C}: ...; end; type TX = (A, B, C); //case TX(IndexStr(S, ['A', 'B', 'C'])) of case TX(GetEnumValue(TypeInfo(TX), S)) of A: ...; B: ...; C: ...; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 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