2009-07-25 15 views
47

Ich verwende den "bool" -Typ für Variablen, wie ich es in C++ gewohnt war, und ich versuche, die Werte von Funktionen oder Eigenschaften, die ich für boolesch halte, in meine Variable zu schreiben. Allerdings stoße ich oft auf Fälle, bei denen der Ergebnistyp "bool?" und nicht "bool" und das implizite Casting schlägt fehl.Was ist der Unterschied zwischen "bool" und "bool?"?

Was ist der Unterschied zwischen den beiden und wann wird jeweils verwendet? Sollte ich auch "bool" benutzen? als Typ für meine Variable? Ist das die beste Praxis?

+0

mögliche Duplikat von [Was bedeutet "DateTime?" meinst du in C#?] (http://stackoverflow.com/questions/109859/what-does-datetime-mean-in-c) – nawfal

Antwort

79

Das ? Symbol nach einem Typ ist nur eine Verknüpfung zu Nullable type, bool? entspricht Nullable<bool>.

bool ist ein value type, bedeutet dies, dass es nicht null sein kann, so dass die Nullable-Typ im Grunde können Sie Werttypen wickeln, und in der Lage null ihnen zuweisen.

bool? können drei verschiedene Werte enthalten: true, false und null.

Auch gibt es keine Kurzschlüsse Operatoren (& & ||) definiert für bool?

nur die logische AND, OR inklusive sind Operatoren definiert und sie verhalten sich wie folgt aus:

x  y  x & y x | y 
true true true true 
true false false true 
true null null true 
false true false true 
false false false false 
false null false null 
null true null true 
null false false null 
null null null null 

der Nullable-Typ ist im Grunde eine generische Struktur, die die folgenden öffentlichen Eigenschaften hat:

public struct Nullable<T> where T: struct 
{ 
    public bool HasValue { get; } 
    public T Value { get; } 
} 

Die HasValue-Eigenschaft gibt an, ob das aktuelle Objekt einen Wert aufweist und die Value-Eigenschaft den aktuellen Wert des Objekts abruft, oder falls HasValue den Wert false hat, wird eine InvalidOperationException ausgelöst.

Jetzt müssen Sie sich etwas fragen, Nullable ist eine Struktur, ein Werttyp, der nicht null sein kann, also warum die folgende Aussage gültig ist?

int? a = null; 

Das Beispiel wird in dieser kompiliert:

.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0) 
IL_0000: ldloca.s V_0 
IL_0002: initobj valuetype [mscorlib]System.Nullable`1<int32> 

Ein Aufruf von initobj, die an einer bestimmten Adresse zu einer Nullreferenz oder ein 0 an dem entsprechenden primitiven Typ jedes Feld des Werttypen initialisiert .

Das ist es, was hier passiert ist die Standardeinstellung struct initialization.

int? a = null; 

entspricht:

Nullable<int> a = new Nullable<int>(); 
+2

Es ist eine gute Antwort, aber kann ich vorschlagen, dass Sie es klar machen, dass bool? ist auch ein Werttyp, es ist eigentlich eine Struktur, die etwas wie {T-Wert; bool _hasValue} – AnthonyWJones

+0

Dank Anthony, habe ich meinen Beitrag ein wenig erweitert. – CMS

+0

Und '! ((Bool?) Null)' ergibt 'null'. –

14

bool? NULL-Werte zulässt, während bool nicht ist.

bool? first; 
bool second; 

In dem obigen Code, first wird null während secondfalse sein wird.

Eine typische Verwendung ist, wenn Sie wissen möchten, ob eine Zuweisung an die Variable vorgenommen wurde. Da bool a Wert Typ (wie int, long, double, DateTime und einige andere Arten), es wird immer auf einen Standardwert initialisiert werden (false im Falle eines bool, 0 im Falle eines int) . Dies bedeutet, dass Sie nicht leicht wissen können, ob es false ist, weil ein Code false zugewiesen wurde, oder wenn es false ist, weil es noch nicht zugewiesen wurde. In diesem Fall ist bool? praktisch.

+7

Beachten Sie, dass diese Standardwerte nur für Instanzen/statische Variablen und nicht für lokale Variablen gelten. –

5

Wann immer Sie das sehen? Zeichen nach einem Typnamen, ist es eine Kurzschrift für Nullable<TypeName>. Nullable ist ein spezieller Typ, mit dem Werttypen wie ein Nullwert fungieren können. Es ist eine Möglichkeit, einen Werttyp explizit auszudrücken, der einen Wert ohne Wert haben kann.

Für bool es stellt sich effektiv die Variable in einen Tri-State-Wert

  • mit dem Wert True
  • Mit: False
  • Ohne Wert
2

bool kann nur true enthalten und false Werte während bool? kann auch einen null Wert haben.

3

bool? bedeutet, der Boolesche Wert ist Nullable und ist syntaktischer Zucker für eine Struktur Nullable<bool>. Da ein boolescher Wert ein Werttyp ist, können Sie ihn nicht auf null setzen. Es gibt jedoch einige Fälle, in denen Sie eine Datenzugriffsklasse bevorzugen sollten, da Datenbankfelder Nullwerte haben können.

4

Durch Hinzufügen von ? ist der Typ nicht mehr zulässig. Was bedeutet, dass Sie dies tun können:

bool? x = null; 

Und es wäre völlig in Ordnung.

0

Bool bedeutet, dass Sie Werte von True und False haben können. bool? bedeutet, dass Sie einen Wert von true, false und null haben können.

Es funktioniert für Datetime und Booleans.

1

Ein weiterer guter Ort, um Bool zu verwenden? ist in einer Methode Nullprüfung hinzufügen

public bool? IsTurkeyStillInFridge(Turkey turkey) 
{ 
    if (turkey == null) 
    return null; 
    else if (fridge.Contains(turkey)) 
    return true; 
    else 
    return false; 
} 

bool? canStayAtDesk = IsTurkeyStillInFridge(turkey); 

if (canStayAtDesk == null) 
    MessageBox.Show("No turkey this year, check for ham."); 
else if (canStayAtDesk == true) 
    MessageBox.Show("Turkey for lunch. Stay at desk."); 
else 
    MessageBox.Show("Turkey's gone, go out to lunch."); 
Verwandte Themen