4

当我用.FirstOrDefault方法查询数据库时,我如何处理它给我的结果?我特别关心空值,目前我有类似的东西:

if (result == default(TypeOfResult))
{
    handleIt();
}

但我不完全知道这个“默认”是什么,所以我想知道这样做是否更好:

if (result == null)
{
    handleIt();
}

哪一个会起作用?这个“默认”到底是什么?

4

4 回答 4

8

FirstOrDefault将返回序列中的第一个元素,或者字面上是相关类型的默认值。

因此,根据您查询的内容,默认值可能会发生变化。例如,集合intdefault值将为 0。因此,检查是否null不起作用。

考虑:

List<int> s = new List<int>();
var x = s.FirstOrDefault();

这里x等于0

引用类型怎么样?

List<MyCustomClass> s = new List<MyCustomClass>();
var x = s.FirstOrDefault();

这里x将是null

这可能是两种方法中更好的一种:

if (result == default(TypeOfResult))
{
   handleIt();
}
于 2012-08-23T16:01:37.003 回答
6

如果TypeOfResult是引用类型,那么

result == default(TypeOfResult)result == null 意思一样

因为引用类型的默认值在null.

默认关键字只返回给定类型的“默认值”,如果是null. 对于值类型,它取决于类型,例如 0 表示int等。

顾名思义FirstOrDefault,如果集合为空,将返回集合的第一个元素或给定类型的默认值。

于 2012-08-23T16:01:01.110 回答
1

如果您想确保您的代码可以使用 default(T) 进行故障保存,其中 T 是一个值类型,您可以将您的项目装箱在 Nullable 对象中。

例如:

var ints = new List<int>(){1,2,3,4,6};
int result = ints.Where(i => i == 0).FirstOrDefault();

即使列表中没有 0,结果也是 0!

var ints = new List<int>(){1,2,3,4,6};
var nullable = ints.Select(i => new Nullable<int>(i));
var result = nullable.Where(i => i == 0).FirstOrDefault()

结果为null,列表中没有0!

这当然更慢并且需要更多内存,但也适用于非值类型。

于 2012-08-24T10:28:15.377 回答
0

您应该检查 Null。如果找不到任何结果,FirstOrDefault 将返回 NULL。

看到这个帖子

于 2012-08-23T16:01:26.263 回答