AGB  ·  Datenschutz  ·  Impressum  







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

Cast von Nullable<> (Spring4D) nach Variant

Ein Thema von Der schöne Günther · begonnen am 10. Sep 2014 · letzter Beitrag vom 10. Sep 2014
Antwort Antwort
Der schöne Günther

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

Cast von Nullable<> (Spring4D) nach Variant

  Alt 10. Sep 2014, 14:14
Ich habe mich vor den Delphi-Variants immer gedrückt und weiß wenig darüber. Hier, was ich glaube:

System.Variants.Null() liefert ein Variant, das bei seinen Casts immer "Null" zurückgibt. Auf eine Zahl ist es 0 , auf einen String ist es ein leerer String, auf eine Referenz ist es Nil usw.

Dementgegen steht System.Variants.Unassigned() : Das liefert einen Variant, der nichts ist. Man kann ihn nirgendwo hin casten, es steckt nichts drin.

Richtig soweit? Wenn ja wundert es mich, warum ein leeresSpring4D-Nullable<> (also mit nichts drin) beim Cast auf ein Variant Null() zurückgibt und nicht Unassigned() .

Welchen Grund hat das? Hier noch einmal der aktuelle Sourcecode in Spring:
Delphi-Quellcode:
class operator Nullable<T>.Implicit(const value: Nullable<T>): Variant;
var
  v: TValue;
begin
  if value.HasValue then
  begin
    v := TValue.From<T>(value.Value);
    if v.IsType<Boolean> then
      Result := v.AsBoolean
    else
      Result := v.AsVariant;
  end
  else
    Result := Null; // Warum?
end;
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: Cast von Nullable<> (Spring4D) nach Variant

  Alt 10. Sep 2014, 14:25
'Null' ist einfacher zu handhaben als 'Unassigned'. Aber wissen tut das nur Meister Stevie.
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: Cast von Nullable<> (Spring4D) nach Variant

  Alt 10. Sep 2014, 15:10
wenn du einen Variant mit dem Wert Null einem Integer oder einer Stringvariable zuweist, bekommst Du doch nicht 0, bzw. '' sondern eine Exception.
Für mich als Datenbankentwickler ist Null halt "leer". Unassigned kommt in meinen Gedankengängen nicht vor

Somit kann ich mit der Behandlung, wie es in Spring4D gelöst ist, sehr sehr gut leben. Ich hab (nach dem Vortrag von Stevie am Samstag) meine Anwendung von der Verwendung von Variants auf TNullable umgestellt. Das hat problemlos funktioniert und macht den Code deutlich schöner.
Jens
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Cast von Nullable<> (Spring4D) nach Variant

  Alt 10. Sep 2014, 16:39
Soweit ich weiß, ist Unassigned eher für OLE Zeugs - siehe auch Dokumentation, die da sagt:
Zitat:
Note: Unassigned is useful with variants referencing OLE Automation Objects that you want to keep "alive" until another value is assigned to the variant.
Und da der Typ Nullable<T> und nicht Unassignable<T> heißt, machts imho eher Sinn, Null zurückzuliefern, wenn der Nullable<T> leer ist.

Beim Hineingeben eines Variants sorgen sowohl Null als auch Unassigned (es wird mit VarIsNull or VarIsEmpty geprüft) dafür, dass es ein leerer Nullable<T> ist.
Allerdings muss sich beim herausgeben eines Variants für eins von beidem entschieden werden und da macht Null wie zuvor erwähnt eher Sinn.

System.Variants.Null() liefert ein Variant, das bei seinen Casts immer "Null" zurückgibt. Auf eine Zahl ist es 0 , auf einen String ist es ein leerer String, auf eine Referenz ist es Nil usw.

Dementgegen steht System.Variants.Unassigned() : Das liefert einen Variant, der nichts ist. Man kann ihn nirgendwo hin casten, es steckt nichts drin.
Genau das Gegenteil ist der Fall, eine Zuweisung von Unassigned auf einen anderen Typ gibt immer den default Wert dieses Typs zurück (0, Leerstring, etc).
Bei Null gibts einen EVariantTypeCastError.

Ich hab meine Anwendung von der Verwendung von Variants auf TNullable umgestellt. Das hat problemlos funktioniert und macht den Code deutlich schöner.
Das freut mich, dass es so gut geklappt hat.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (10. Sep 2014 um 16:45 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: Cast von Nullable<> (Spring4D) nach Variant

  Alt 10. Sep 2014, 16:46
Soweit ich mich erinnere, kann auf 'v = Null' geprüft werden ('v' ist ein Variant), aber auf 'v = Unassigned' nicht. Es ist also ein netter Nebeneffekt auch in Hinblick auf den Vergleich, das hier 'Null' geliefert wird.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Cast von Nullable<> (Spring4D) nach Variant

  Alt 10. Sep 2014, 16:48
Soweit ich mich erinnere, kann auf 'v = Null' geprüft werden ('v' ist ein Variant), aber auf 'v = Unassigned' nicht. Es ist also ein netter Nebeneffekt auch in Hinblick auf den Vergleich, das hier 'Null' geliefert wird.
Doch geht beides, mit dem kleinen Haken, dass 0 = Unassigned true ist und sich Unassigned somit nicht als expliziter Zustand für "ist leer" benutzen lässt.
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.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Cast von Nullable<> (Spring4D) nach Variant

  Alt 10. Sep 2014, 17:16
Genau das Gegenteil ist der Fall, eine Zuweisung von Unassigned auf einen anderen Typ gibt immer den default Wert dieses Typs zurück (0, Leerstring, etc).
Bei Null gibts einen EVariantTypeCastError.
Oh, stimmt, da habe ich mich vertan.

Mein Szenario war folgendes: Ich habe ein paar Variablen vom Typ Nullable<IrgendeinTyp> und muss die in einer TQuery in die Parameter (Data.DB.TParam ) stecken. Ein TParam hat eine Property Value vom Typ Variant . Der Setter dieser Property setzt die TParam-Eigenschaft Bound := VarIsClear(variantDings) . Bound gibt an, ob der Parameter gesetzt ist.

Ja, er ist gesetzt, und zwar auf NULL. Ich habe also, trotz anfänglicher Verwirrung, genau was ich will
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 04:05 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