测试';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进行比较表示惊讶。

有优势吗?

测试';null';与';默认值(T)';

优势:没有。区别:有。

如果使用例如int,则FirstOrDefault将默认返回0。与null相比是无用的,与default(T)相比则不然。

null的情况下,表达式将生成false,在default(T)的情况下生成true

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

FirstOrDefault返回null,如果您要查找的类型是引用类型,并且您的查询没有任何结果。所以没有任何理由使用default

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

更新

从MSDN关于FirstOrDefault的文档中,我们发现该方法的签名如下:

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

正如上面所说:

返回序列的第一个元素,如果序列不包含元素

或者换句话说,返回

如果源为空,则为default(TSource)

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

考虑到以上内容,使用default(T)更接近于文档,其中T是if语句中的类型。

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

这里显然没有区别。我想,当你将来把它改为一组值类型时,它会产生影响,但

1) 这在我的经历中并不常见。

2) 这意味着你的集合不能包含0,尽管它很可能是一个合法的值。

就我个人而言,!= null阅读起来更舒服。