2010-06-28 35 views
3

我有這個類可空類?

public class FilterQuery 
    { 
     public FilterQuery() { } 

     public string OrderBy { set; get; } 
     public string OrderType { set; get; }   

     public int? Page { set; get; } 
     public int ResultNumber { set; get; } 

    } 

我想用它像這樣

public IQueryable<Listing> FindAll(FilterQuery? filterQuery) 

這可能嗎?

感謝

+0

聽起來像你想過載,而不是可空 – Marc 2010-06-28 13:21:14

+0

然後,我複製的代碼? – 2010-06-28 13:34:00

回答

20

這立即迴避的爲什麼的問題。類定義爲參考類型,因此已經可以爲空。將它們包裝爲可空類型是沒有意義的。

在你的情況,你可以簡單地定義:

public IQueryable<Listing> FindAll(FilterQuery filterQuery) 

,並呼籲FindAll(null)通過沒有過濾器的查詢。 。

如果您正在使用C#/。NET 4.0,一個不錯的選擇是:

public IQueryable<Listing> FindAll(FilterQuery filterQuery = null) 

這意味着你甚至不用到指定空。重載會在以前的版本中做同樣的技巧。

編輯:每請求,超載只會看起來像:

public IQueryable<Listing> FindAll() 
{ 
    return FindAll(null); 
} 
+0

我明白了...但事情是我有比較複雜的方法,如果我超載,我會複製整個方法? – 2010-06-28 13:33:42

+0

@ile:完全沒有,請參閱我更新的帖子。 – Noldorin 2010-06-28 13:35:51

+0

我明白了,謝謝Noldorin! – 2010-06-28 13:41:52

6

有沒有必要這樣做;所有class類型都是引用類型,這意味着根據定義它可以爲空。的確,在編譯時無法實現它是非空

Nullable<T>結構被設計爲允許值類型(根據定義非空)表示空值。

還值得注意的是,比較Nullable<T>null(或VB.NET中的Nothing)的能力是語法糖;因爲Nullable<T>是一個結構體,它實際上不可能是null。在其代表空值的情況下,HasValuefalseValuedefault(T)

+0

您可以在編譯時使用斷言和形式驗證來強制執行非空條件。如果您安裝Microsoft「代碼合同」擴展,則Visual Studio 2008/10中有一個內置工具。但是,正式(靜態)驗證只有在你的代碼的每個部分都被很好地聲明,並且你的條件不依賴於運行時纔有效。 更簡單:形式驗證不起作用。 – 2010-06-28 13:26:32