2

在使用空传播运算符一段时间后,我偶然发现编写了一个用于选择单个项目的 linq 子句。是否有理由(性能、最佳实践)不使用 ?.First()?

MyList?.First();

或者

MyList.FirstOrDefault();
4

2 回答 2

12

这不是性能或最佳实践的问题;他们只是不做同样的事情。

MyList?.First()MyList如果为 null将返回 null (First()由于 null 传播运算符甚至不会被调用),InvalidOperationException如果它为空则抛出一个(因为First()对空列表的调用是无效的)。

MyList.FirstOrDefault()将抛出ArgumentNullExceptionif MyListis null (因为您不能FirstOrDefault使用 null 调用),如果列表为空,则返回 null (或类型的默认值,如果它是值类型)。

要处理这两种情况(MyList为空,MyList为空),您可以这样做:

MyList?.FirstOrDefault()
于 2015-08-20T09:52:11.440 回答
2

这两行根本不等价。

如果不包含任何元素,则第一个将抛出MyList,但如果它为空则不会。

如果为 null,则第二个将抛出MyList,但如果它不包含任何元素,则不会。

于 2015-08-20T09:52:53.327 回答