1.什麼是null
一般說來,null表示空類型,也就是表示什麼都沒有,但是“什麼都沒有”並不意味“什麼都不是”。實際上,null是如此的重要,以致於在JavaScript中,Null類型就作為5種基本的原始類型之一,與Undefined、Boolean、Number和String並駕齊驅。這種重要性同樣表現在.NET中,但是一定要澄清的是,null並不等同於0,"",string.Empty這些通常意義上的“零”值概念。相反,null具有實實在在的意義,這個意義就是用於標識變數引用的一種狀態,這種狀態表示沒有引用任何對象執行個體,也就是表示“什麼都沒有”,既不是Object執行個體,也不是User執行個體,而是一個Null 參考而已。在.NET中,null表示一個對象引用是無效的。作為參考型別變數的預設值,null是針對指標(引用)而言的,它是參考型別變數的專屬概念,表示一個參考型別變數聲明但未初始化的狀態,例如:
object obj = null;
2 Nullable<T>(可空類型)
一直以來,null都是參考型別的特有產物,對實值型別進行null操作將在編譯器拋出錯誤提示,例如:
//拋出編譯時間錯誤int i = null;
正如樣本中所示,很多情況下作為開發人員,我們更希望能夠以統一的方式來處理,同時也希望能夠解決實際業務需求中對於“值”也可以為“空”這一實際情況的映射。因此,自.NET 2.0以來,這一特權被新的System.Nullable<T>(即,可空實值型別)的誕生而打破,解除上述詬病可以很容易以下面的方式被實現:
//Nullable<T>解決了這一問題int? i = null;
你可能很奇怪上述樣本中並沒有任何Nullable的影子,實際上這是C#的一個文法糖,以下代碼在本質上是完全等效的:
int? i = null; Nullable<int> i = null;
顯然,我們更中意以第一種簡潔而優雅的方式來實現我們的代碼,但是在本質上Nullable<T>和T?他們是一路貨色。可空類型的偉大意義在於,通過Nullable<T>類型,.NET為實值型別添加“可空性”,例如Nullable<Boolean>的值就包括了true、false和null,而Nullable<Int32>則表示值即可以為整形也可以為null。
對於可空類型,使用注意:
- 可空類型表示值為null的實值型別。
- 不允許使用嵌套的可空類型,例如Nullable<Nullable<T>> 。
- Nullable<T>和T?是等效的。
- 對可空類型執行GetType方法,將傳回型別T,而不是Nullable<T>。
- c#允許在可空類型上執行轉換和轉型,例如:
int? a = 100; Int32 b = (Int32)a; a = null;
3 ??運算子
在實際的程式開發中,為了有效避免發生異常情況,進行null判定是經常發生的事情,例如對於任意對象執行ToString()操作,都應該進行必要的null檢查,以免發生不必要的異常提示,我們常常是這樣實現的:
string objName = obj == null ? string.Empty : obj.ToString();
因為上述實現是如此的頻繁,所以.NET 3.0中提供了新的操作運算子來簡化null值的判斷過程,這就是:??運算子。上述過程可以以更加震撼的代碼錶現為:
string objName = (obj ?? string.Empty).ToString();
??運算子,又稱為null-coalescing operator,如果左側運算元為null,則返回右側運算元的值, 如果不為null則返回左側運算元的值。它既可以應用於可空類型,又可以應用於參考型別。