1、bool?和bool (VS2012版本下的)
bool關鍵字是System.Boolean的別名(實際上bool是基本值類型,Boolean是對象;bool是C#中的,Boolean是.net Framework中的。其實它們倆是一樣啦,沒什么差別的),用於生成變量存儲布爾值true、false。bool數據類型在內存中占1個字節。但bool? 可以為null的類型(下面擴展中有解釋的),包含三個不同的值:true、false和null。bool變量的默認值為 false,而bool?變量的默認值為 null。 所以 bool? 類型不能用在條件語句(如if、for或while)中,否則會導致編譯器的錯誤。
例如:
bool? b=null; if(b) { }
上訴代碼是不允許的,因為null 在條件上下文中的含義並不清楚,若要在條件語句中使用 bool?,請首先確定其HasValue不是null,然后再將它強制轉換為bool;如果對使用null 值的 bool? 執行強制轉換,那么將會引發 InvalidOperationException異常。
因此,微軟給出下面的方法可以 將bool?安全的強制轉換為bool (這個才是重點呢)
bool? test = null; ... if(!test.HasValue) //選擇一個值 { test = IsInitialized(); } if((bool)test) { ... }
注意: 在C++中,bool 類型的值可以轉換為 int 類型的值,也就是說:false 等效於零值,而 true 等效於非零值。但在C#中,不存在bool類型與其他類型之間的相互轉換。
2、擴展:C#中使用可以為null的類型
(1)可以為null的類型有兩種聲明方式:
System.Nullable<T> variable 或 T? variable
T 是可以為null 的類型的基礎類型,T 可以是包括 struct 在內的任何值類型,但不能是引用類型。其實 T? 意思就是 T范圍值+ 上可為空的值。
(2)類型示例
任何值類型都可用作可以為 null 的類型的基礎,如:
int? i = 10; double? d1 = 3.14; bool? flag = null; char? letter = 'a'; int?[] arr = new int?[10];
###### bool, string, int 這些叫做值類型(value type);Boolean, String, Int32這些叫做引用類型(Reference Type)。值類型是存在內存的 stack(堆棧)中的,而引用類型存在 heap(堆)中。
(3)成員
可以為 null 的類型的每個實例都具有兩個公共的只讀屬性:
HasValue
HasValue 屬於 bool 類型。 當變量包含非 null 值時,它被設置為 true。
Value
Value 的類型與基礎類型相同。 如果 HasValue 為 true,則說明 Value 包含有意義的值。 如果 HasValue 為 false,則訪問 Value 將引發 InvalidOperationException異常。
--后記:上課時老師提到的,然后我在CSDN和其他網站查了下,總結下來了,@_@