2009-07-25 45 views
47

我在C++中使用「bool」類型的變量,並且試圖將我期望爲布爾值的函數或屬性的值放入我的變量中。然而,我經常遇到結果類型爲「bool?」的情況而不是「布爾」,隱式投射失敗。「bool」和「bool?」有什麼區別?

兩者之間的區別是什麼以及每個使用何時?另外,我應該使用「布爾?」作爲我的變量的類型?這是最佳做法嗎?

+0

可能重複[什麼是「DateTime?」在C#?](http://stackoverflow.com/questions/109859/what-does-datetime-mean-in-c) – nawfal 2013-05-17 13:23:43

回答

79

?後面的符號只是Nullable type的快捷方式,bool?相當於Nullable<bool>

boolvalue type,這意味着它不能null,所以空類型基本上可以讓你包裝值類型,並且能夠分配null給他們。

bool?可以包含三個不同的值:true,falsenull

另外,還有一些(& & ||)爲bool?

沒有定義短路運營商只有邏輯AND,OR包容性,運營商的定義,他們這樣的表現:

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 

Nullable類型基本上是一個通用結構,它具有以下公共屬性:

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

HasValue屬性指示當前對象是否有值,並且Value屬性將獲取對象的當前值,或者如果HasValue爲false,則會引發InvalidOperationException。

現在你一定想知道一些事情,Nullable是一個struct,一個不能爲null的值類型,所以爲什麼下面的語句是有效的?

int? a = null; 

即例如將編譯成這樣:

.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> 

的調用initobj,其在一個指定的地址爲空引用或適當的原語類型的0初始化值類型的每個字段。

就是這樣,這裏發生了什麼是默認的struct initialization

int? a = null; 

等同於:

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

它是一個很好的答案,但我可以建議你說清楚,布爾?它也是一個值類型,它實際上是一個包含{T值;布爾_hasValue} – AnthonyWJones 2009-07-25 07:57:43

+0

謝謝安東尼,我擴大了我的帖子一點點。 – CMS 2009-07-25 08:45:46

14

bool?爲空,而bool不是。

bool? first; 
bool second; 

在上述代碼中,firstnullsecondfalse

一個典型的用法是如果你想知道是否有一個賦值給變量。由於bool值類型(正如intlongdoubleDateTime和一些其他類型),它將總是被(在int的情況下falsebool0的情況下)初始化爲缺省值。這意味着你不能很容易地知道它是否爲false,因爲某些代碼分配給它false,或者如果它是false,因爲它尚未分配。在這種情況下,bool?派上用場。

5

每當你看到?字符是一個類型名稱,它是Nullable<TypeName>的簡寫。 Nullable是一種特殊的類型,它允許值類型像空值一樣工作。這是一種明確表達值類型的方式,可以具有非值的值。

對於bool它有效地把變量放到一個三態值

  • 有了值:True
  • 值爲:假
  • 沒有價值
2

bool只能包含truefalse值,而bool?也可以具有null值。

3

bool?意味着布爾值可以爲空,並且是結構化的語法糖Nullable<bool>。因爲布爾值是一個值類型,所以不能將其設置爲null,但是在某些情況下,您希望在數據訪問類中使用它,因爲數據庫字段可以具有空值。

4

添加?使類型無效。這意味着你可以這樣做:

bool? x = null; 

而且這將是完全沒問題。

0

布爾意味着你可以有真值和假值。 bool?意味着您可以具有true,false和null值。

它適用於日期時間和布爾值。

1

另一個使用bool的好地方?是在一種方法中添加空檢查

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."); 
相關問題