【问题标题】:Null propagated ?.First() vs .FirstOrDefault()Null 传播 ?.First() 与 .FirstOrDefault()
【发布时间】:2015-11-13 21:39:15
【问题描述】:

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

MyList?.First();

MyList.FirstOrDefault();

【问题讨论】:

    标签: linq c#-6.0 null-propagation-operator


    【解决方案1】:

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

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

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

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

    MyList?.FirstOrDefault()
    

    【讨论】:

    • 所以事实上 MyList?.FirstOrDefault() 可能是我的首选,感谢您的详尽解释。
    • @jakke.korpelainen:这种超级安全方法的唯一问题是你不知道为什么它是null。列表是null,是空的还是第一个元素null?因此很容易得出错误的结论或接受无效状态。
    【解决方案2】:

    这两行根本不等价。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      相关资源
      最近更新 更多