Cast eine null in sowas???
Hatte ich diese interessante Diskussion heute mit einem Kollegen. Wir waren debattieren zwei Stücke von code in C#.
Code-Snippet 1:
if(!reader.IsDBNull(2))
{
long? variable1 = reader.GetInt64(2)
}
Code-Snippet 2:
long variable1 = reader.IsDBNull(2) ? (long?) null : reader.GetInt64(2)
Frage ist: ist es eine gute Praxis, cast null in eine null-lange? Oder würden Sie lieber die traditionellen if-Anweisung zu vermeiden, casting null
zu nullable lange.
Auch der cast ist für den Bedingten Operator, den Sie verwenden, müssen Sie den return-Typ der Filialen ähnlich sein und snippet2 ist compiler-Fehler, den Sie benötigen, um zu sein
Als V4Vendetta sagte, in Ihrem zweiten Ausschnitt Ihres lh-und rh-Typen sind unterschiedlich.
In snippet1,
long? variable1
Als V4Vendetta sagte, in Ihrem zweiten Ausschnitt Ihres lh-und rh-Typen sind unterschiedlich.
In snippet1,
variable1
existiert nur innerhalb der if
's scope.InformationsquelleAutor Bull | 2012-05-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ausdrücke
(type?)null
,default(type?)
undnew Nullable<type>()
am Ende wird kompiliert in der gleichen opcodes:sich in:
In anderen Worten, wenn Sie arbeiten mit nullable-Typen, Sie sind frei zu verwenden, je nachdem, welche version Ihnen am besten gefällt. Beachten Sie jedoch, dass Sie sollten versuchen zu vermeiden, Arithmetik mit nullable-Typen. Wenn Sie wieder eine null-Wert aus einem bedingten Ausdruck, beide möglichen Ergebnisse müssen null sein, wenn einer von Ihnen kann auf null gesetzt werden. Jede andere Art und Weise könnte es zu einer Ausnahme in diesem Fall.
null as type?
ist auch zusammengestellt in denselben IL-code. In der Tatnull
müssen nicht gegossen werden explizit, wenn die umliegende Ausdruck stellt eine nullable-Typ, Kontext, z.B.condition ? null : value as type?
. Dienull
in diesem Ausdruck ist auch erstellt, um dienew Nullable<type>()
IL-code.InformationsquelleAutor Wormbo
Statt
verwenden
Ich würde umgestalten obigen code wie
long?
?Tippfehler im cut copy paste, Dank für den Hinweis
InformationsquelleAutor Tilak
Ich lieber nicht zu wirken
null
Wert (es sieht merkwürdig für mich):Andere Optionen:
Es ist nur die Frage des Geschmacks. Ich denke, die erste option ist besser lesbar als andere.
UPDATE: beachten Sie auch das schreiben einige extension-Methoden, um Ihren code übersichtlicher:
In diesem Fall, die Sie nicht verwenden, ternärer operator (kein casting, um null-Werte zulässt), und Lesen Werte aus reader sieht eher ziemlich:
Ich wurde dieser Tippfehler, bevor Sie den ersten Kommentar
haben Sie immer noch bis es
...? null : (long?)reader.GetInt64(2)
🙁bis es
long? variable1
Sie haben compiler Nähe , sollte es geben, keine implizite Konvertierung zwischen <null> und lange (Sie haben zu werfen die null in Ihrem Ausdruck) Hoffe, Sie bekommen mein Punkt ! !
InformationsquelleAutor Sergey Berezovskiy
Snippet 2 ist Wert, in meinem Fall, wie im Fall der
null
kriegt man0
, das ist ein völlig Gültiger Wert fürlong
InformationsquelleAutor undefined
In C# 7.1 Sie können die präziser
default
- literal:InformationsquelleAutor Daniel Liuzzi