![]() |
Spring4D: Nullables
Eine Verständnisfrage zu
![]() ![]()
Delphi-Quellcode:
Der Compiler hat nichts dagegen, einem
procedure test();
var numberValue: Spring.Nullable<Integer>; begin numberValue := 99.0; numberValue := TObject.Create(); end;
Delphi-Quellcode:
praktisch alles mögliche zuzuweisen. Das liegt daran, dass für ein Nullable eine implizite Operator-Überladung für
Nullable<Integer>
Delphi-Quellcode:
definiert ist:
Variant
Delphi-Quellcode:
class operator Implicit(const value: Variant): Nullable<T>;
Kritik an Spring4D kann ich mir nicht erlauben, aber ich finde das schrecklich. Warum sollte man so etwas wollen? Zwischen
Delphi-Quellcode:
und
Nullable<T>
Delphi-Quellcode:
hin und her ist klar, aber warum Variant zu Nullable<T> generell erlauben?
T
|
AW: Spring4D: Nullables
Weil du dann aus einer Datenbank die Werte direkt zuweisen kannst und ein
Delphi-Quellcode:
-Wert dann korrekt zugewiesen wird.
NULL
Im Übrigen kann man eine Referenz durchaus einem
Delphi-Quellcode:
zuweisen ;)
Integer
Was nicht gehen sollte ist
Delphi-Quellcode:
var
ni : Nullable<Integer>; ni := 'Moin'; |
AW: Spring4D: Nullables
Delphi-Quellcode:
sollte aber auch nicht gehen.
ni := TObject.Create()
|
AW: Spring4D: Nullables
Gerade mal eben geschaut, es liegt nicht an den Variants, sondern an
Delphi-Quellcode:
type
Nullable<T> = record // ... class operator Implicit(value: Pointer): Nullable<T>; // Übeltäter // ... end; |
AW: Spring4D: Nullables
Zitat:
Zitat:
Delphi-Quellcode:
schreiben kann.
meinNullable := nil
Über die Nützlichkeit und die möglichen Auswirkungen davon kann man gerne diskutieren. Aber wenn man das nicht mag, auskommentieren, glücklich sein. Das ist ja das schöne an open Source, gell? :) |
AW: Spring4D: Nullables
Klar, das mit dem
Delphi-Quellcode:
ist natürlich viel komfortabler als irgendein Hickhack mit vielleicht
:= nil
Delphi-Quellcode:
oder sowas.
TNullable<Integer>.Empty
Aber mit dem Variant-Gedöns kann ich mich wirklich nicht anfreunden. Die ganze Typsicherheit geht einem doch da den Bach runter. War die Intention denn von Anfang an, das mit
Delphi-Quellcode:
-Objekten kompatibel zu machen? Wenn ja, dann wäre ein eigener Typ
TField
Delphi-Quellcode:
oder sowas besser.
TFieldContent<T>
Auskommentieren und Spring neu kompilieren habe ich mich noch nicht getraut, ich hätte spontan erwartet dass Spring die Nullables dann selbst irgendwo so benutzt und ihm diese Operator-Überladung dann fehlt... |
AW: Spring4D: Nullables
Dein eingangs beschriebenes Problem liegt einzig und allein an dem Pointer overload, den ich aber in Rücksprache mit meinem Kollegen für 1.2 entfernen werde.
Immerhin kann man ja
Delphi-Quellcode:
schreiben, was exakt dieselbe Auswirkung hat, nur ohne die negativen Seiteneffekte, dass ich sämtliche Referenztypes assignen kann.
:= Null
Nullable<T> <-> Variant Kompatibilität ist explizites Feature. Allerdings werden auch nur Variants akzeptiert, die direkt den zu T passenden Typen haben. Das hier geht also nicht:
Delphi-Quellcode:
Kompiliert zwar (sorry!) aber wirft zur Laufzeit ein EInvalidCast.
myIntNullable := '5';
|
AW: Spring4D: Nullables
Würdet ihr euch denn dazu überreden lassen der
Delphi-Quellcode:
-Property dann einen Setter zu verpassen damit man, wenn man will, zur Compile-Zeit ein bisschen Typsicherheit hat?
Value
Wenn die Pointer-Überladung rausfällt, bekommt ein Nullable dann eine
Delphi-Quellcode:
-Methode oder wie löscht man den?
Clear()
|
AW: Spring4D: Nullables
Zitat:
Überleg mal, was sonst mit solchem Code passiert:
Delphi-Quellcode:
Da Nullable<T> ein Record ist, würdest du nämlich dann nur die lokale Kopie verändern.
myObj.NullableIntProp.Value := 42;
... siehe ![]() Zitat:
Delphi-Quellcode:
Außerdem könnte man sonst eine readonly nullable Eigenschaft nicht vor Modifikation schützen können.
x := Null;
... |
AW: Spring4D: Nullables
Bitter, da habe ich auf die Schnelle nicht dran gedacht.
Trotzdem macht mir
Delphi-Quellcode:
Angst. Ist mir neulich zum ersten mal zur Laufzeit um die Ohren geflogen und jetzt frage ich mich die ganze Zeit wie ich noch solche Stellen finden kann...
myNullableInteger := 'Wurst'
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 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 by Thomas Breitkreuz