在.net 1.1中我們無法對基礎類型,如int、DateTime、enum類型等賦予null的值,但這在實際應用中往往會帶來很多麻煩,比如有下面這個函數:
class OrderDAC{
public ArrayList GetOrders(OrderStatus status){
}
}
public enum OrderStatus{
Initial,
Canceled,
Delivered
}
如果我們希望該函數GetOrders中當輸入的為status == null 的時候擷取所有OrderStatus的訂單,而如果status不等於 null 時擷取指定狀態下的訂單,在.net 1.1中根本無法實現,因為我們無法將 status 設為 null,因為它是基礎類型。
又考慮另外一種情況,如:
OrderInfo order = new OrderInfo();
order.DeliveryDate = reader.IsDbNull("DeliveryDate") == true? null : (DateTime) reader["DeliveryDate"];
上面的代碼實際上無法編譯通過,因為DateTime不允許付空,取而代之的是:
if( reader.IsDbNull("DeliveryDate") == false){
order.DeliveryDate = (DateTime) reader["DeliveryDate"];
}
當我們要判斷 order.DeliveryDate 是否有賦值,也不能採用 if( order.DeliveryDate == null ),這時往往需要給類似的欄位賦一個預設值,比如 DateTime.MinValue,但這處理起來也是挺麻煩的。
幸運的是,在.net 2.0中,提供了 Nullable的範型,通過它,我們可以為基礎類型如int等賦予null的值,具體如下:
class OrderDAC{
public List<OrderInfo> GetOrders(Nullable<OrderStatus> status){
}
}
上面用到了兩個範型,一個是List<OrderInfo>,一個是Nullable<OrderStatus>,有了這個,我們就可以調用
OrderDAC ord = new OrderDAC();
List<OrderInfo> orders = ord.GetOrders(null);
這樣我們就可以為 OrderStatus status 賦予null的值,是不是方便了很多呢?
同樣,我們也可以定義
class OrderInfo{
public Nullable<DateTime> DeliveryDate;
}
這樣,我們就可以為OrderInfo.DeliveryDate 賦予 null,並且可以判斷 OrderInfo.DeliveryDate == null ,又方便了很多。
其實象這樣的例子還有很多:)
.net 2.0 確實為我們提供了很多便利,期待正式版!!