Was ist die Verwendung von Nullable<bool> geben?
einen bool variable halten konnte, wahr oder falsch, während bool? könnte null sein, da gut.
Wäre, warum brauchen wir einen Dritten Wert für bool ?
Wenn es nicht wahr, was immer es ist, es ist == false
Können Sie vorschlagen, ein Szenario, wo ich Lust auf eine bool? statt.
Dank
- Für die Vereinfachung der Suche, da googeln für ein Fragezeichen ist eine echte Schlampe 🙂 Die full-Typ ist
Nullable<bool>
- Sie brauchen nicht ein Dritter Wert für
bool
, das ist der Grund, warum es nur zwei. Aberbool?
- das istNullable<T>
woT
istbool
- ist etwas ganz anderes - es bedeutet "entweder ist diesnull
oder einen Wert aus dem Wertebereich des Typsbool
". - Das ist der Grund, SOF ist nicht lassen Sie mich hinzufügen: eine neue bool? tag!!!!
- Zum speichern einer
maybe
Wert - Wahr? Falsch? Datei Nicht gefunden? thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx
- Vertreten FileNotFound natürlich... thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx
Du musst angemeldet sein, um einen Kommentar abzugeben.
Etwas kann true, false oder undefined für viele Gründe. Wie könnte man die Antwort "Ist Ihr drittes Kind ein Mädchen?", wenn man nur zwei Kinder hat? Sowohl wahr als auch falsch sind, falsch. Null wäre angebracht zu sagen, dass der Vergleich nicht gelten.
Verschiedene Antworten diskutieren die Bedeutung von nullable-Typen im Allgemeinen. Es gibt eine weitere Antwort für die nullable boolean, speziell. Es ist schwer zu verstehen, in C#, aber sehr einfach zu verstehen, wenn man sich bei einem null-Wert die Logik in jedem Datenbank.
Lassen Sie uns sagen, Sie verfolgen eine Liste oder Tabelle von
Shipments
. EinShipment
hat eineDeliveryDate
, aber natürlich Sie nicht wissen, diese Informationen, bis lange nachdem die Sendung gemacht wurde, und wahrscheinlich mindestens ein paar Tage nach der Lieferung wurde tatsächlich geliefert, wenn UPS endlich herum, um Sie darüber zu informieren. Also, natürlich, dasDeliveryDate
ist einNullable<DateTime>
(oderDateTime?
).Wollen Sie zum abrufen einer Liste aller Sendungen, die ausgeliefert wurden in der letzten Woche. So schreiben Sie dies:
Sollten Sendungen mit einer
null
Liefertermin enthalten sein? (Die Antwort ist natürlich keine.)OK, also, was über diese:
Sollten Sendungen mit einer
null
Liefertermin enthalten diese Ergebnisse? Die Antwort ist noch keine.So, jetzt haben Sie eine merkwürdige situation. Man könnte denken, dass zwischen zwei dieser Anfragen, Sie erhalten alle Sendungen in das system.
A | !A
ist immertrue
, richtig? Nicht wenn Sie den Umgang mit null-Werten.Sogar das man nicht bekommen Sie alle Ergebnisse:
Also, wie ist das möglich?
Damit repräsentieren diese Logik, die Sie benötigen, ein Zustand, der nicht wahr ist oder falsch. Und mal wieder C# ist irgendwie ein schlechtes Beispiel, weil hier nicht implementieren die Logik, die Art und Weise, die Sie würde wirklich erwarten, dass es. Aber in SQLese, macht es Sinn, weil:
Klar,
NULL OR NULL
nochNULL
, nichtTRUE
. Das ist, wie Sie richtig sagen, dass eine Sendung nicht zugestellt wurde, bevor der Anfang der Woche, und wurde nicht geliefert nach. Oder, genauer gesagt, wissen wir nicht wissen, wenn es geliefert wurde, so dass wir nicht sicher sagen, dass es hat entsprechend dieser Bedingungen.Aber C# ist nicht so konsistent. In C#, wenn die
DeliveryDate
null ist, dann:Denen bekommt man die richtige Antwort für unsere Anfrage oben, so dass Sie könnten versucht sein, zu sagen, dass regelmäßige Boolesche Logik ist gut genug, nur dass diese eine gibt es alles:
Aha... jetzt gibt es uns zurück
null
Liefertermine! Das ist nicht richtig! Und bevor jemand sagt "@Aaronaught, was du über über, natürlich, es ist richtig! Diese Sendungen wurden NICHT zugestellt wird, bevor in der letzten Woche, so sollte die Bedingung abzudecken!", stoppen Sie und denken Sie darüber für eine Sekunde.Den
NULL
bedeutet eigentlich nicht, dass Sie nicht geliefert. DieNULL
bedeutet, dass wir nicht wissen, wenn Sie geliefert wurden. Es ist möglich, dass ein Sachbearbeiter holt die Bestätigung morgen, und füllen Sie dieDeliveryDate
als vor zwei Wochen, entkräften die Daten von uns nur abgeholt. Es sollte nicht null-Instanzen auf dem Rückweg von der Abfrage, und doch gibt es. Wenn man schrieb, der gleichen Abfrage in SQL, diese Ergebnisse ausgeschlossen werden.So, warum sollten Sie Sorge
Nullable<bool>
wenn C# anscheinend nicht? So können Sie vermeiden, fallen in diesem Falle in Ihren eigenen code:Dies ist ein wenig umständlich, aber korrekt. Wir haben geschrieben, eine Abfrage, die mehr oder weniger kommuniziert seine Absicht richtig und
(bool?)null
ist nicht gleichzusetzen mittrue
oderfalse
, so erhalten wir die richtigen Ergebnisse in beiden Fällen.Wenn Sie jemals brauchen werden, um zu bewerten, ein Zustand, wo die Antwort könnte sein "weiß ich nicht" - verwenden Sie eine
bool?
(AKANullable<bool>
) als Ergebnis.Diese Weise kann der Aufrufer entscheiden, wie Sie zu behandeln, ein "ich weiß nicht" - Antwort, statt Sie einfach wählen Sie eine Vorgabe. Alles andere bedeutet, dass Ihre Klasse ist liegen.
einen
null
Wert bedeutet "kein Wert" oder "unbekannter Wert". In diesem Fall, es ist nicht wahr, noch falsch, aber undefined.Finden Sie unter: http://en.wikipedia.org/wiki/Many-valued_logic
bool?
tristate. 🙂Es ist gut, wenn etwas noch nicht beantwortet ist - denken Sie an einen Fragebogen. Sie haben eine Liste von J/n-Fragen und nur einige beantwortet wurden. Sie würde nicht wollen, post-true oder false, um die Datenbank-Tabelle, da der user noch nicht beantwortet ist die Frage noch.
könnte es unbekannt sein, zusätzlich zu true oder false..in der Datenbank landen, eine NULL bedeutet in der Regel unbekannt oder kein Wert
Faul Programmierung!
einen null-Wert bedeutet
einen null-Wert bedeutet Mu
Habe ich es in einem Filter Wert. Im Grunde habe ich ein bool-Feld in der Datenbank, aber ich wollte drei Staaten: Nur die Rückgabe von Zeilen, wo der Wert true ist, werden nur Zeilen zurückgeben, bei denen der Wert false ist, nicht filtern und alle Zeilen.
Ohne nullable bool würde ich entweder auf ein enum oder ein zweites bool um festzustellen, "Filter, indem Sie in diesem Feld ja/Nein" würde hinzufügen aufblasen.
werden null-Werte zulässt, könnte darauf hindeuten, dass der bool-hat nicht gesetzt oder initialisiert, wenn das ist etwas, was dein Programm braucht, um zu wissen,
Nun, ich konnte sehen, dass es als "Nicht festgelegt" Art der Sache, ich benutze bools alle Zeit und manchmal, nur zwei Werte sind nicht genug!! zum Beispiel:
meiner Meinung nach nur der Dritte Wert einer bool.
bool
haben, erhalten Sie eineunassigned variable
Fehler beim kompilieren.Wenn Sie über die Verwendung einer Nullable bool, würde ich überlegen, einen Enum oder andere Daten-Struktur statt. Es kann Ihnen helfen, Fehler zu vermeiden, wenn die Bedeutung der NULL ist nicht bekannt.
Kürzlich, ich behandelte eine Nullable bool. Ich gehe nicht in die details der Fehler, aber können nur sagen, es war schlimm genug, um eine vollständige rollback. Ich begann mich zu Fragen, wie praktisch es ist, zu verwenden in den meisten Anwendungen. (Zum Teil in einem Versuch zu halten, um meinen gebrochenen stolz, wie ein Ergebnis der dummen Fehler ? )
Dann stieß ich auf diesen Beitrag und Lee akzeptierte Antwort.
Scheint dies Sinn zu machen, aber je mehr Zeit ich mit ihm zu verbringen, die Antwort wird FALSCH in der Praxis anstelle von NULL. NULL ist einfach zu unscharf.
Bevor wir diese Frage beantworten, müsste man weisen eine sehr spezifische Bedeutung zu NULL. Hat NULL zu bedeuten, es war ein Fehler in der Berechnung? Was ist, wenn es ist ein Fehler in der Berechnung vor, es wird festgestellt, dass es nur zwei Kinder? (Ich würde auch behaupten, dass wenn es tatsächlich nur zwei Kinder, diese könnten behandelt werden, bevor die Frage gestellt wurde, das Programm).
Weil wir nicht wissen, was NULL bedeutet und weil es definitiv nicht STIMMT (weil, wie könnte es sein?) die BESTE Antwort ist FALSCH.
Auch, wenn diese Frage in der Tat gibt NULL zurück, die wir eingeführt haben, eine neue definition der Domäne. Was ist der Zweck dieser definition?
So scheint es, dass TRUE oder FALSE Staaten stellen eine Sicherheit im Hinblick auf ein Ergebnis. NULL gedacht werden kann, in mindestens drei verschiedenen Staaten. Zum Beispiel, ist die Aussage "Thomas ging zu der bar Letzte Nacht."
WAHR – ja, Thomas ging zur bar. (wahrscheinlichste Antwort, wenn Sie wüssten, Thomas)
FALSE – Nein, Thomas wollte nicht in die bar gehen.
NULL – Huh?
Erkennbar – Etwas schief ging in der ersten Berechnung. E. g. Sie fragte Thomas die Frage, aber verachten, während er antwortete , Rendern Sie taub momentan. Sie einfach zu Fragen, ihn wieder zu bekommen Sie die Antwort.
Unerkennbar – Die bar niedergebrannt und Thomas übersprungen Stadt. Es gibt keine realistische Möglichkeit, sich die Antwort. (Bitte don ' T poke Löcher in diesem, aber ich weiß, du wirst)
Nicht anwendbar – Siehe das obige Beispiel in Bezug auf die drei Kinder, aber bars und Thomases statt.
Was bedeutet NULL-hier bedeuten? Die Bestimmung, was NULL bedeutet, die durchgeführt werden müssen, auf einer Fall-zu-Fall-basis. Dies ist der Grund, warum ich glaube, es ist oft besser, eine Enum oder eine andere Struktur, da es mehr anmutig macht die Absicht, die hinter einem nicht-binären Wert zurückgeben.
Würden Sie verwenden möchten, die zur Abdeckung der situation "was ist, wenn der Benutzer nicht angibt, weder wahr noch falsch?"
Es ist nur ein Weg, um alle möglichen Ergebnisse.
Lassen Sie uns sagen, dass eine Bestellung eingegangen ist, aber nicht ausgeliefert noch. Was ist der Wert von
Order.ShippedDate
?Die altmodische Art und Weise zu handhaben, zu nutzen, um einen magischen Wert wie
DateTime.MinValue
. Es gab noch andere Möglichkeiten das problem zu lösen (zum Beispiel ein wrapper-Typ oder eine zusätzlichebool
flag, das anzeigt, dass die Bestellung noch nicht ausgeliefert noch). Keines von diesen ist sehr zufriedenstellend. Was wir brauchen, ist eine einheitliche Art und Weise zu behandeln das problem einer fehlenden oder unbekannten Wert.Also der moderne Ansatz ist, um zu ermöglichen
Order.ShippedDate
zu nehmen, auf einen Wert, der semantisch erfasst, dass die Bestellung noch nicht ausgeliefert noch. Das ist die Rolle, die nullable-Typen spielen. Semantisch sollten Sie denken Sie an eine Instanz derNullable<T>
mitHasValue
wirdfalse
als die für "fehlend" oder "unbekannt".Weiter, Datenbanken schon lange erlaubt eine Spalte ermöglicht
null
. Zum Beispiel, könnten Sie ein integer-Wert der Spalte, die null zulässt. Wie arbeiten Sie mit solchen Spalte von code, wenn Sie nicht zulassen, dass null-Werte zulässtint
s? Wieder, könnten Sie mit den oben genannten Ansätzen, aber es ist so viel schöner, wenn die Sprache hat eine eingebaute Anlage für semantisch erfassen der situation, die wir versuchen zu modellieren.Hier ist ein weiterer Anwendungsfall. Denken Sie an eine hierarchische Datenstruktur, die eine Boolesche Eigenschaft. Einstellung der Immobilie auf die Eltern für alle Ihre Kinder, wenn diese explizit festgelegt sind. Denke nur-Lese-Berechtigungen für Dateien und Ordner in Windows (die haben einen tri-state-checkbox).
Ich denke, dass die primäre motivation (zumindest war es auf diese Art dargestellt :-)) für das hinzufügen von auf null festlegbaren Typen in C# 2 Datenbanken. In der Datenbank werden alle Daten geben können, haben die
NULL
Wert und, wenn die Zuordnung dieser zu C#, das ist ein problem. Nullable-Typen ermöglichen Ihnen, sich mit dieser ganz aus - Sie könnenint?
,bool?
und andere. Sie werden verwendet, zum Beispiel bei LINQ to SQL.Was bedeutet der Dritte Wert bedeuten für booleans, das ist natürlich abhängig von der Anwendung. Ich denke, dass in der Regel, es bedeutet, dass der Wert/Bereich nicht verfügbar ist.