测试';null';与';默认值(T)';
本文关键字:null 测试 默认值 | 更新日期: 2023-09-27 18:28:35
当我开始使用LINQ时,我复制的一个示例使用了这个模式,从那以后我一直在使用它。下面是最近一段代码中的一个例子:
var heartbeat = db.HeartBeats.Where(hb => hb.macHash == macAddressHash).FirstOrDefault();
if (heartbeat != default(HeartBeat))
{
result = heartbeat;
}
一些同事对将LINQ查询的结果与default(T)
而不是null
进行比较表示惊讶。
有优势吗?
优势:没有。区别:有。
如果使用例如int
,则FirstOrDefault
将默认返回0
。与null
相比是无用的,与default(T)
相比则不然。
在null
的情况下,表达式将生成false
,在default(T)
的情况下生成true
。
在这种情况下,如果HeartBeat
是引用类型,则没有任何区别。
FirstOrDefault
返回null
,如果您要查找的类型是引用类型,并且您的查询没有任何结果。所以没有任何理由使用default
。
然而,我不认为相互使用有任何好处。我能想到的唯一好的事情是使用null
比default(HeartBeat)
更具表现力。我这么说是因为当我们使用default
时,首先我们读取表达式default(HeartBeat)
,然后我们回忆起引用类型的默认类型是null
。而使用null
,可以避免几毫秒的思考。
更新
从MSDN关于FirstOrDefault
的文档中,我们发现该方法的签名如下:
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source)
正如上面所说:
返回序列的第一个元素,如果序列不包含元素。
或者换句话说,返回
如果源为空,则为default(TSource)
。
否则为源中的第一个元素。
考虑到以上内容,使用default(T)
更接近于文档,其中T
是if语句中的类型。
但是,我更喜欢使用默认值null
、0
、false
等,而不是default(T)
。这并不意味着这绝对不是正确的方法。这是个人意见。你挑。
这里显然没有区别。我想,当你将来把它改为一组值类型时,它会产生影响,但
1) 这在我的经历中并不常见。
2) 这意味着你的集合不能包含0,尽管它很可能是一个合法的值。
就我个人而言,!= null
阅读起来更舒服。