【发布时间】:2015-11-13 21:39:15
【问题描述】:
在使用空传播运算符一段时间后,我偶然发现编写了一个用于选择单个项目的 linq 子句。是否有理由(性能、最佳实践)不使用 ?.First()?
MyList?.First();
或
MyList.FirstOrDefault();
【问题讨论】:
标签: linq c#-6.0 null-propagation-operator
在使用空传播运算符一段时间后,我偶然发现编写了一个用于选择单个项目的 linq 子句。是否有理由(性能、最佳实践)不使用 ?.First()?
MyList?.First();
或
MyList.FirstOrDefault();
【问题讨论】:
标签: linq c#-6.0 null-propagation-operator
这不是性能或最佳实践的问题;他们只是不做同样的事情。
如果MyList 为空,MyList?.First() 将返回空(由于空传播运算符,First() 甚至不会被调用),如果InvalidOperationException 为空,则抛出一个InvalidOperationException(因为调用First()空列表无效)。
MyList.FirstOrDefault() 如果MyList 为空(因为您不能使用空调用FirstOrDefault),则MyList.FirstOrDefault() 将抛出一个ArgumentNullException,如果列表返回空(如果它是值类型,则返回该类型的默认值)是空的。
要处理这两种情况(MyList 为空,MyList 为空),您可以这样做:
MyList?.FirstOrDefault()
【讨论】:
null。列表是null,是空的还是第一个元素null?因此很容易得出错误的结论或接受无效状态。
这两行根本不等价。
如果MyList 不包含任何元素,则第一个将抛出,但如果它为空则不会。
如果MyList 为空,则第二个将抛出,但如果它不包含任何元素,则不会。
【讨论】: