Welches ist bevorzugt: Nullable & lt; & gt; .HasValue oder NULLable & lt; & gt; ! = null?
Ich immer (a) Nullable<>.HasValue
denn ich mochte die Semantik. Jedoch, vor kurzem arbeitete ich auf einer anderen vorhandenen code-Basis, wo Sie (b) Nullable<> != null
ausschließlich statt. Gibt es einen Grund, einen über den anderen, oder ist es rein Präferenz?
(a)
int? a;
if (a.HasValue)
...
(b)
int? b;
if (b != null)
...
InformationsquelleAutor der Frage lc. | 2009-03-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der compiler ersetzt null Vergleiche mit einem Aufruf
HasValue
so gibt es keinen wirklichen Unterschied. Nur tun, je mehr lesbar/macht mehr Sinn für Sie und Ihre Kollegen.InformationsquelleAutor der Antwort Rex M
Ich lieber
(a != null)
so, dass die syntax entspricht Referenz-Typen.InformationsquelleAutor der Antwort cbp
Habe ich einige der Forschung auf dieser durch die Verwendung verschiedener Methoden, um Werte zuzuweisen, um eine null-int. Hier ist, was passiert, wenn ich nicht verschiedene Dinge. Sollten klären, was Los ist.
Beachten Sie:
Nullable<something>
oder die Kurzformsomething?
ist eine Struktur, für die der compiler scheint zu tun, eine Menge Arbeit, um uns mit null, als ob es eine Klasse.Wie Sie unten sehen werden,
SomeNullable == null
undSomeNullable.HasValue
immer wieder ein erwartet true oder false. Obwohl nicht gezeigt, untenSomeNullable == 3
gilt auch (vorausgesetzt, SomeNullable ist einint?
).Während
SomeNullable.Value
bringt uns zu einem Laufzeitfehler, wenn wir zugewiesennull
zuSomeNullable
. Dies ist in der Tat der einzige Fall, wo nullables könnte uns dazu führen, ein problem, Dank einer Kombination von überladen von Operatoren, überladenobject.Equals(obj)
Methode, und der compiler-Optimierung und monkey business.Hier ist eine Beschreibung von einigen code, den ich lief, und das, was Ausgabe, die es produziert Etiketten:
Ok, probieren wir die nächste Initialisierung Methode:
Alle die gleichen wie vorher. Beachten Sie, dass die Initialisierung mit
int? val = new int?(null);
mit null an den Konstruktor übergeben, hätte erzeugt einen COMPILE time error, da die nullable-Objekt der WERT null ist NICHT zulässig. Es ist nur der wrapper-Objekt selbst, die können gleich null.Ebenfalls, wir würden eine compile-Zeit-Fehler-aus:
nicht zu erwähnen, dass
val.Value
ist ein nur-lese-Eigenschaft sowieso, so können wir nicht einmal so etwas wie:aber wieder, polymorphe überlastet implizite konvertierungsoperatoren lassen Sie uns tun:
Brauchen keine sorgen zu machen polysomthing whatchamacallits obwohl, so lange, wie es richtig funktioniert? 🙂
InformationsquelleAutor der Antwort Perrin Larson
In VB.Net. Verwenden Sie NICHT "IsNot Nothing", wenn Sie verwenden können ".HasValue". Ich löste eine "Operation destabilisieren könnte die runtime mit" Mittleres Vertrauen Fehler durch Austausch "IsNot " Nichts" mit ".HasValue" auf einem Fleck. Verstehe ich nicht wirklich warum, aber irgend etwas ist passiert, anders als in den compiler. Ich würde davon ausgehen, dass "!= null" in C# haben können dem gleichen Problem.
InformationsquelleAutor der Antwort Carter Medlin
Wenn Sie die linq und möchten, dass Ihr code kurz, ich empfehlen immer die Verwendung
!=null
Ist, und deshalb:
Lassen Sie sich vorstellen, wir haben einige Klasse
Foo
mit einem nullable-Doppel - variableSomeDouble
Wenn irgendwo in unserem code, wir wollen alle Foo mit einem nicht-null-SomeDouble Werte aus einer Sammlung von Foo (vorausgesetzt, einige foos in der Sammlung kann null sein), wir am Ende mit mindestens drei Art und Weise zu schreiben, unsere Funktion (wenn wir C# 6) :
Und in dieser Art von situation, die ich empfehlen, gehen immer für die kürzere
InformationsquelleAutor der Antwort yan yankelevich
Allgemeine Antwort, und die Faustregel: wenn Sie eine option (z.B. das schreiben von benutzerdefinierten serialisierungsprogramme) zu verarbeiten null-Werte zulässt, die in verschiedenen pipeline als
object
- und die Nutzung Ihrer spezifischen Eigenschaften - tun Sie es und verwenden Sie null-Werte zulässt, spezifischen Eigenschaften.So konsequent denken Sicht
HasValue
bevorzugt werden sollten. Konsistent denken kann Ihnen helfen, besseren code zu schreiben, nicht zu viel Zeit in details.E. g. es zweite Methode wird um ein Vielfaches effektiver (vor allem, weil der Compiler inlining und Boxen, aber immer noch zahlen sind sehr ausdrucksstark):
Benchmark-test:
Benchmark-code:
https://github.com/dotnet/BenchmarkDotNet verwendet wurde
PS. Die Leute sagen, dass der Ratschlag "lieber HasValue, weil der konsequenten denken" ist nicht im Zusammenhang-und sinnlos. Können Sie Vorhersagen, die Leistung dieser?
PPS Menschen weiterhin minus, aber niemand versucht vorherzusagen die Leistung von
CheckNullableGenericImpl
. Und da der compiler wird nicht helfen, Sie ersetzen!=null
mitHasValue
.HasValue
sollte direkt verwendet werden.InformationsquelleAutor der Antwort Roman Pokrovskij