最近在學習C# 2.0,在.NET Framework 2.0中新增加了System.Nullable泛型結構,它具有處理值類型數據具和處理null的功能。例如:
System.Nullable
<
int
>
i
=
2
;
i
=
null
;
System.Nullable
<
bool
>
b
=
null
;
另外C#中還提供了上述表示方法的簡寫形式:
int
?
i
=
null
;
bool
?
b
=
null
;
此時,i除了可以正常處理int值外還可以被賦值為null;b則可以處理true、false和null值。感覺上好像“值類型可以處理null”似的,實際上,上面的System.Nullable<int>是對int的一種擴展,前者可被稱為“可空的int”,后者被稱為“非空的int”,它們所指的並非同一事物。因此,當把一個可空類型值賦給一個非空類型時,將引發編譯錯誤,例如:
int
?
ni
=
null
;
int
i
=
ni;
//
這一句將引發編譯錯誤
推薦的方法是賦值前對可空類型的值進行檢查,在C#中使用??運算符分配默認值,如:
int
?
ni
=
null
;
int
i
=
ni
??
0
;
??運算符會首先判斷左操作數是否為空,如果為空則返回??后面給出的默認值,否則返回左操作數,其意義類似於:
int
?
ni
=
null
;
int
i
=
ni.HasValue
?
ni.Value :
0
;
提醒:System.Nullable<int>並不等同於int,值類型還是值類型,int類型不能處理null,System.Nullable<int>是一種新的結構類型,被用來處理int類型數據和null。