2014-10-30 73 views
2

當我開始使用LINQ時,我複製的其中一個樣本使用了這種模式,這種模式從那以後一直使用。下面是最近的一些代碼示例:測試'null'與'default(T)'的測試

var heartbeat = db.HeartBeats.Where(hb => hb.macHash == macAddressHash).FirstOrDefault(); 
if (heartbeat != default(HeartBeat)) 
{ 
    result = heartbeat; 
} 

幾個同事都在LI​​NQ查詢的結果比較default(T)而非null表示驚訝。

有沒有優勢?

+0

我已經標記了[Christos的答案](http://stackoverflow.com/a/26649990/575530)作爲答案,但值得滾動瀏覽評論,以閱讀@ hvd對匿名類型的評論。我經常在LINQ中使用它們,並且爲他們寫'default(T)'不是一個選項。 – dumbledad 2014-10-31 06:35:28

回答

1

如果您正在查找的類型是引用類型並且您的查詢沒有任何結果,則FirstOrDefault返回null。所以沒有任何使用default的理由。

但是,我認爲沒有任何優勢互相利用。我能想到的唯一好處是使用nulldefault(HeartBeat)更具表現力。我這樣說,因爲當我們使用default時,首先我們讀取表達式default(HeartBeat),然後回想一下引用類型的默認類型是null。而使用null,則可以避免毫秒的思考。

更新

MSDN documentationFirstOrDefault,我們認爲這種方法的簽名如下:

public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source) 

,並因爲它是說有:

返回序列的第一個元素,或默認值,如果 序列不包含元素

或者換句話說返回

default(TSource)如果來源是空的。

否則源代碼中的第一個元素。

考慮到以上情況,使用default(T)的文檔更接近文檔,其中T是您在if語句中的類型。

不過,我更喜歡使用默認值,null0false等,而不是default(T)。這並不意味着這絕不是正確的做法。這是個人意見。你選。

+0

謝謝克里斯託斯 - 我認爲可讀性可能是關鍵。我會交換使用'null'比較。 – dumbledad 2014-10-30 10:04:47

+1

'FirstOrDefault ()如果枚舉沒有項目,''不返回'null',它返回'default(T)',根據具體的'T'返回可能是或不可以爲'null'。 – hvd 2014-10-30 10:05:06

+0

@dumbledad歡迎你。我很高興我的幫助。 – Christos 2014-10-30 10:05:14

3

優點:沒有。差異:是的。

如果使用例如int,則FirstOrDefault將返回0作爲默認值。比較null是沒用的,相比之下default(T)沒有。

null的情況下,表達將導致到false,在default(T)的情況下,其結果,以true

在這種情況下,如果HeartBeat是引用類型,它沒有任何區別。

+0

@dumbledad:需要更多幫助? – 2014-10-30 16:01:31

+0

感謝您的幫助Patrick - 我很好。我已經把Christos的標記作爲答案(他是我讀到的第一個,@ hxd在匿名類型中的評論很有趣)。我傾向於堅持一天,然後將答案標記爲恰當的答案。 – dumbledad 2014-10-31 06:38:34

1

顯然這裏沒有什麼區別。我想這會在將來將其更改爲一組價值類型時產生影響,但是

1)這不是我所有的經驗。

2)這意味着你的收藏不能包含0,儘管它可能是一個合理的價值。

我個人覺得!= null更舒適閱讀。