当我开始使用LINQ时,我复制的一个样本使用了这个模式,从那时起我一直在使用它。这是最近一段代码中的一个例子:
var heartbeat = db.HeartBeats.Where(hb => hb.macHash == macAddressHash).FirstOrDefault();
if (heartbeat != default(HeartBeat))
{
result = heartbeat;
}
一些同事对将LINQ查询的结果与default(T)
而不是null
进行比较表示惊讶。
有优势吗?
答案 0 :(得分:3)
优势:没有。差异:是的。
如果您使用int
,FirstOrDefault
将默认返回0
。与null
相比,与default(T)
相比毫无用处。
如果是null
,则表达式将生成false
,如果default(T)
,则结果为true
。
在这种情况下,如果HeartBeat
是参考类型,则它没有任何区别。
答案 1 :(得分:1)
FirstOrDefault
会返回null
,如果您要查找的类型是参考类型且您的查询没有任何结果。因此,使用default
没有任何理由。
但是,我并不认为彼此使用会有任何好处。我能想到的唯一好处是使用null
比default(HeartBeat)
更具表现力。我这样说,因为当我们使用default
时,首先我们读取表达式default(HeartBeat)
,然后我们回想起引用类型的默认类型是null
。然而,使用null
,你可以避免这种毫秒的思考。
<强>更新强>
从MSDN documentation关于FirstOrDefault
,我们知道此方法的签名如下:
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source)
并且在那里说:
返回序列的第一个元素,如果是,则返回默认值 序列不包含元素。
或换句话说,返回
default(TSource)
如果来源为空。
否则是源中的第一个元素。
考虑到上述情况,它更接近于使用default(T)
的文档,其中T
是您在if语句中的类型。
但是,我更喜欢使用默认值null
,0
,false
等,而不是default(T)
。这并不意味着没有正确的方法。这是个人意见。你选。
答案 2 :(得分:1)
显然,这里没有区别。我想如果将来将它更改为值类型的集合会产生影响,但
1)根据我的经验,这并不常见。
2)这意味着你的收藏品不能包含0,尽管它可能是合法的价值。
我个人觉得!= null
更容易阅读。