Ich habe mich gefragt, was die sauberste und verständlichste Syntax für die Durchführung von Bedingungsprüfungen für nullfähige Bools ist.
Ist der folgende gute oder schlechte Codierungsstil? Gibt es eine Möglichkeit, den Zustand besser / sauberer auszudrücken?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
insbesondere der if (nullableBool ?? false) Teil. Ich mag den if (x.HasValue && x.Value)
Stil nicht ...
(nicht sicher, ob die Frage schon einmal gestellt wurde ... konnte bei der Suche nichts Ähnliches finden)
c#
coding-style
nullable
FireSnake
quelle
quelle
Wie wäre es mit GetValueOrDefault , das ziemlich selbsterklärend ist und es ermöglicht, jeden gewünschten Standard zu verwenden:
quelle
System.NotSupportedException: LINQ to Entities does not recognize the method 'Boolean GetValueOrDefault()' method, and this method cannot be translated into a store expression.
Sie mögen es vielleicht nicht, aber ich persönlich finde
am besten lesbar. Es macht deutlich, dass Sie mit einem nullbaren Typ arbeiten, und es macht deutlich, dass Sie zuerst prüfen, ob der nullbare Typ einen Wert hat, bevor Sie bedingt darauf reagieren.
Wenn Sie Ihre Version nehmen und die Variable durch x ersetzen, lautet sie auch:
Ist das so klar? Ist es offensichtlich, dass x ein nullbarer Typ ist? Ich werde dich entscheiden lassen.
quelle
x
ist im Kontext in Ordnung und manchmal sauberer; zu wissen:var openOrders = orders.Where(x=>x.Open ?? false)
Wenn Sie a
null
als falsch behandeln möchten, würde ich sagen, dass der prägnanteste Weg, dies zu tun, die Verwendung des Null-Koaleszenz-Operators (??
) ist, wie Sie beschreiben:quelle
Denken Sie nur an Bool? Wenn Sie 3 Werte haben, wird es einfacher:
quelle
Verwenden Sie Erweiterungen.
quelle
null
wietrue
?Überprüfen wir, wie der Vergleich mit null definiert ist:
und die Ergebnisse sind:
So können Sie sicher verwenden:
quelle
if(nullable)...else if(!nulllable)...else..
Eigentlich denke ich, dass dies
(nullableBool ?? false)
eine legitime Option ist, insbesondere wenn Sie versuchen, einen nullbaren Bool in linq auszuwerten.Beispielsweise:
array.Select(v => v.nullableBool ?? false)
(from v in array where v.nullableBool ?? false)
Ist meiner Meinung nach sauberer im Gegensatz zu:
array.Select(v => v.nullableBool.HasValue ? v.nullableBool.Value : false)
(from v in array where v.nullableBool.HasValue ? v.nullableBool.Value : false)
quelle
Wenn Sie nur
true
gegennull
/ testen möchtenfalse
, ist eine, die ich gerade verwendet habe und die recht gut liest, einequelle
Ich denke, es liegt an dir. Ich denke sicherlich, dass der .HasValue-Ansatz besser lesbar ist, insbesondere bei Entwicklern, die mit dem ?? Syntax.
Der andere Punkt eines nullbaren booleschen Typs ist, dass er tristate ist. Sie möchten also möglicherweise etwas anderes tun, wenn er nur null ist und nicht standardmäßig false.
quelle
Enum gegeben
Sie können es wie hier tun
quelle
nullable boolean
.Wenn Sie sich in einer Situation befinden, in der Sie keine Kontrolle darüber haben, ob ein Teil der Bedingung einen nullbaren Wert überprüft, können Sie immer Folgendes versuchen:
Ich weiß, dass es nicht gerade ein puristischer Ansatz ist, ein Ternär in eine if-Anweisung einzufügen, aber es löst das Problem sauber.
Dies ist natürlich eine manuelle Art zu sagen
GetValueOrDefault(false)
quelle