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