如果没有找到任何项,LINQ's的第一个方法为什么不返回null ?

本文关键字:方法 第一个 为什么不 返回 null 任何项 LINQ 如果没有 | 更新日期: 2023-09-27 18:12:04

我真的不明白First和FirstOrDefault的目的。我是说,我理解功能上的不同。但我真的不"明白"为什么微软认为应该有两种不同的方法?有人知道吗?

如果没有找到任何项,LINQ's的第一个方法为什么不返回null ?

First如果序列为空则抛出异常。这是唯一的区别。

First有一个内置断言,该序列不为空。这就是它的目的。有时您知道序列不能为空。例如,如果您在数据库a中查找一个客户,并且它存在,那么您知道它也将存在于数据库B中。如果它在B中不存在,这将是一个bug。

如果有bug,你想要一声巨响来提醒你。这就是为什么断言通常在生产代码中很有用。您当然不希望继续使用坏数据执行。这使得寻找bug的起源变得更加困难,甚至可能完全隐藏bug。

First的全部意义在于,拥有这个内置断言通常是非常有用的。

对于SingleSingleOrDefault也是如此。这些断言序列永远不能有多个元素。事实证明,这通常是您在实际代码中想要的。

FirstOrDefault还允许您处理序列为空而First不为空的情况(捕获异常将是对异常的滥用)。

此外,First记录了您对序列长度的了解,因此对于阅读代码的任何人来说,这一事实都是显而易见的。

FirstOrDefault提供两个逻辑路径来处理是否有数据结果。因此,它的处理仅在调用它的作用域的局部。First提供了一个通过异常跳出局部作用域的方法。

设计为什么

First只返回当前作用域的数据,但是能够处理任何异常不可预见的没有数据的情况,并将其作为应用程序类型错误通过Exception处理。该异常可以由当前作用域之外的集中控制器处理。

因此,这取决于如何处理缺乏数据,是在本地处理还是在本地作用域之外处理,以及应该在多大程度上处理无数据情况。

为什么微软认为应该有两种不同的方法?

程序员根据需要为不同情况编写代码的灵活性。