C# 2.0中的範型和Nullable範型

來源:互聯網
上載者:User

在.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 確實為我們提供了很多便利,期待正式版!!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.