测试'null'与测试'default(T)'

时间:2014-10-30 09:58:47

标签: c# linq

当我开始使用LINQ时,我复制的一个样本使用了这个模式,从那时起我一直在使用它。这是最近一段代码中的一个例子:

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

一些同事对将LINQ查询的结果与default(T)而不是null进行比较表示惊讶。

有优势吗?

3 个答案:

答案 0 :(得分:3)

优势:没有。差异:是的。

如果您使用intFirstOrDefault将默认返回0。与null相比,与default(T)相比毫无用处。

如果是null,则表达式将生成false,如果default(T),则结果为true

在这种情况下,如果HeartBeat是参考类型,则它没有任何区别。

答案 1 :(得分:1)

FirstOrDefault会返回null,如果您要查找的类型是参考类型且您的查询没有任何结果。因此,使用default没有任何理由。

但是,我并不认为彼此使用会有任何好处。我能想到的唯一好处是使用nulldefault(HeartBeat)更具表现力。我这样说,因为当我们使用default时,首先我们读取表达式default(HeartBeat),然后我们回想起引用类型的默认类型是null。然而,使用null,你可以避免这种毫秒的思考。

<强>更新

MSDN documentation关于FirstOrDefault,我们知道此方法的签名如下:

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

并且在那里说:

  

返回序列的第一个元素,如果是,则返回默认值   序列不包含元素

或换句话说,返回

default(TSource)如果来源为空。

否则是源中的第一个元素。

考虑到上述情况,它更接近于使用default(T)的文档,其中T是您在if语句中的类型。

但是,我更喜欢使用默认值null0false等,而不是default(T)。这并不意味着没有正确的方法。这是个人意见。你选。

答案 2 :(得分:1)

显然,这里没有区别。我想如果将来将它更改为值类型的集合会产生影响,但

1)根据我的经验,这并不常见。

2)这意味着你的收藏品不能包含0,尽管它可能是合法的价值。

我个人觉得!= null更容易阅读。