AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Spring4D: Nullables

Ein Thema von Der schöne Günther · begonnen am 13. Nov 2015 · letzter Beitrag vom 10. Aug 2017
Antwort Antwort
Seite 1 von 2  1 2      
Der schöne Günther

Registriert seit: 6. Mär 2013
6.111 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Spring4D: Nullables

  Alt 13. Nov 2015, 12:11
Eine Verständnisfrage zu Nullable<T> in Spring4D:

Delphi-Quellcode:
procedure test();
var
   numberValue: Spring.Nullable<Integer>;
begin
   numberValue := 99.0;
   numberValue := TObject.Create();
end;
Der Compiler hat nichts dagegen, einem Nullable<Integer> praktisch alles mögliche zuzuweisen. Das liegt daran, dass für ein Nullable eine implizite Operator-Überladung für Variant definiert ist:

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 Nullable<T> und T hin und her ist klar, aber warum Variant zu Nullable<T> generell erlauben?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Spring4D: Nullables

  Alt 13. Nov 2015, 12:23
Weil du dann aus einer Datenbank die Werte direkt zuweisen kannst und ein NULL -Wert dann korrekt zugewiesen wird.

Im Übrigen kann man eine Referenz durchaus einem Integer zuweisen

Was nicht gehen sollte ist
Delphi-Quellcode:
var
  ni : Nullable<Integer>;

ni := 'Moin';
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Spring4D: Nullables

  Alt 13. Nov 2015, 12:33
ni := TObject.Create() sollte aber auch nicht gehen.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Spring4D: Nullables

  Alt 13. Nov 2015, 13:13
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#5

AW: Spring4D: Nullables

  Alt 13. Nov 2015, 21:20
Weil du dann aus einer Datenbank die Werte direkt zuweisen kannst und ein NULL -Wert dann korrekt zugewiesen wird.
Den Wunsch nach einer einfachen Zuweisung für ein Datenbank-Feld kann ich nachvollziehen. Dafür aber die Typ-Sicherheit beim Kompilieren aufzugeben wäre mir ein zu hoher Preis.

Mein Vorschlag
  • Implizite Variant Zuweisung aus Spring.Nullable<T> entfernen
  • Helper-Klasse für TDataSet mit AsNullable<T>

Dann könnte man schreiben

Delphi-Quellcode:
var
  myNullableInt: Spring.Nullable<T>
...
  myNullableInt := myQuery.FieldByName('MY_FELD').AsNullable<Integer>;
  // alternative Syntax
  myNullableInt := myQuery.NullableField<Integer>('MY_FELD');

Geändert von HeZa (13. Nov 2015 um 21:24 Uhr) Grund: Kleine Ergänzung
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.111 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Spring4D: Nullables

  Alt 16. Nov 2015, 08:32
Ich verstehe eins hierbei noch nicht:

Warum ist denn die Variant-Geschichte eigentlich Implicit und nicht Explicit?

Wäre Sie es, kann ich immer noch sagen
myNullableInt := myDatabaseField.Value oder
myNullableInt := myStrangeVariant

Ich kann allerdings nicht mehr sagen
myNullableInt := myFloatValue
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Spring4D: Nullables

  Alt 16. Nov 2015, 08:34
Wenn also Nullables beliebigen Typs sein können, wieso verwende ich nicht dann einfach Variants?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Spring4D: Nullables

  Alt 16. Nov 2015, 08:48
Wenn also Nullables beliebigen Typs sein können, wieso verwende ich nicht dann einfach Variants?
Ein Nullable<T> soll eben nicht alles beinhalten, sondern typsicher einen Wert vom Typ T oder eben nichts.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.012 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Spring4D: Nullables

  Alt 16. Nov 2015, 09:41
Ich verstehe eins hierbei noch nicht:

Warum ist denn die Variant-Geschichte eigentlich Implicit und nicht Explicit?

Wäre Sie es, kann ich immer noch sagen
myNullableInt := myDatabaseField.Value oder
myNullableInt := myStrangeVariant

Ich kann allerdings nicht mehr sagen
myNullableInt := myFloatValue
Nö, implicit heißt normale Zuweisung, explicit heißt, dass man einen Hardcast nutzen muss.

Also so:
myNullableInt := Nullable<Integer>(myDatabaseField.Value); oder
myNullableInt := Nullable<Integer>(myStrangeVariant)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.111 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Spring4D: Nullables

  Alt 16. Nov 2015, 10:11
Nö, implicit heißt normale Zuweisung, explicit heißt, dass man einen Hardcast nutzen muss.
Hardcast, oder gleich den passenden Typen reinstecken. Also myDatabaseField.Value . Das will man im Endeffekt doch.

Oder ist es tatsächlich, wie Dejan Vu meint, nur als eine andere Schreibweise für Variants gedacht?


Delphi-Quellcode:
      class operator Explicit(const from: Variant): Nullable<T>;
      class operator Implicit(const from: T): Nullable<T>;
erlaubt:

Delphi-Quellcode:
var
   myWrapper: TWrapper<Integer>;
   myVariant: Variant;
begin
   myWrapper := 42;

   //myWrapper := 'Hallo'; // nope

   myWrapper := Variant('Hallo');
   // oder
   myVariant := 'Hallo';
   myWrapper := myVariant;
end.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz