空传播 ?.First() 与 .FirstOrDefault()
Null propagated ?.First() vs .FirstOrDefault()
在使用空传播运算符一段时间后,我无意中写了一个用于选择单个项目的 linq 子句。是否有理由(性能、最佳实践)不使用 ?.First()?
MyList?.First();
或
MyList.FirstOrDefault();
这不是性能或最佳实践的问题;他们只是不做同样的事情。
如果 MyList
为空,MyList?.First()
将 return 为空(由于空传播运算符,First()
甚至不会被调用),并抛出一个 InvalidOperationException
如果它是空的(因为在空列表上调用 First()
是无效的)。
MyList.FirstOrDefault()
将抛出一个 ArgumentNullException
如果 MyList
为 null(因为你不能用 null 调用 FirstOrDefault
),并且 return null (或类型的默认值(如果它是值类型)如果列表为空。
要处理这两种情况(MyList
为空,MyList
为空),您可以这样做:
MyList?.FirstOrDefault()
这两行根本不等价。
如果 MyList
不包含任何元素,第一个将抛出,但如果它为空则不会。
如果 MyList
为 null,第二个将抛出,但如果它不包含任何元素则不会。
在使用空传播运算符一段时间后,我无意中写了一个用于选择单个项目的 linq 子句。是否有理由(性能、最佳实践)不使用 ?.First()?
MyList?.First();
或
MyList.FirstOrDefault();
这不是性能或最佳实践的问题;他们只是不做同样的事情。
如果MyList
为空,MyList?.First()
将 return 为空(由于空传播运算符,First()
甚至不会被调用),并抛出一个 InvalidOperationException
如果它是空的(因为在空列表上调用 First()
是无效的)。
MyList.FirstOrDefault()
将抛出一个 ArgumentNullException
如果 MyList
为 null(因为你不能用 null 调用 FirstOrDefault
),并且 return null (或类型的默认值(如果它是值类型)如果列表为空。
要处理这两种情况(MyList
为空,MyList
为空),您可以这样做:
MyList?.FirstOrDefault()
这两行根本不等价。
如果 MyList
不包含任何元素,第一个将抛出,但如果它为空则不会。
如果 MyList
为 null,第二个将抛出,但如果它不包含任何元素则不会。