为了账号安全,请及时绑定邮箱和手机立即绑定

为什么不要再使用 FirstOrDefault 方法了

FirstOrDefault() 在 .NET 的 LINQ (语言集成查询) 中常用于获取序列中的第一个元素,如果序列为空,则返回默认值(对于引用类型通常是 null,对于值类型则是 default(T))。

重新考虑使用 FirstOrDefault 的几个原因,FirstOrDefault(第一个非空项):

  1. 目标不明确:名称 FirstOrDefault 可能会导致逻辑理解上的混淆。有时很难区分默认值(null)是正常的还是表示错误。
  2. 可空性问题:使用 FirstOrDefault 可能会导致意外的 NullReferenceException,因为如果找不到匹配元素,它会返回 null。如果代码没有显式处理 null,可能会引发运行时异常。
  3. 性能:虽然 FirstOrDefault 对大多数情况都适用,但如果你确定集合中至少有一个元素,使用 First()(找不到元素时会抛出异常)更为合适。这有助于使代码更健壮,并尽早发现潜在错误。
  4. 增强代码可读性:较新的 C# 版本和模式鼓励更好地处理可空性问题,例如使用可空引用类型 (T?) 和模式匹配功能,使得使用 FirstOrDefault 不再那么必要,并促进使用更具表现力的替代方法。
FirstOrDefault的替代方法

使用 First() 方法:

如果你确定至少存在一个元素,并且希望在找不到元素时抛出异常,First() 可能是一个更好的选择。这会强制这个假设并避免默默地返回 null 值。

    var firstItem = list.First(); // 如果列表为空,会抛出异常

使用SingleOrDefault()方法:

如果你期望只有一项但又想确保没有多余的一项,可以使用更严格的 SingleOrDefault() 方法。如果找到超过一项,它会抛出异常。

var singleItem = list.SingleOrDefault(); // 确保只有一个项,如果没有就返回默认值

明确的空值检查

避免使用 FirstOrDefault 并冒着返回 null 的风险,可以考虑先用 Any()Count() 明确处理空值情况,这样可以使您的意图更明确:

    if (list.Any())  
    {  
        var firstItem = list.First();  
    }  
    else  
    {  
        // 如果没有元素就处理这种情况  
    }
FirstOrDefault 方法的出处

FirstOrDefault() 是 C# 中 LINQ(语言集成查询)扩展方法的一部分。它常用于查询类似 IEnumerable<T> 的序列。它是在 .NET 3.5 中随着 LINQ 被引入语言时出现的,旨在提供更声明式和可读的方式来查询集合数据。

如何使用 FirstOrDefault

FirstOrDefault() 通常用于获取集合或列表中的第一个元素,如果集合为空或没有找到匹配的元素,则返回默认的值。这里是如何通常使用的例子。

TSource 获取第一个非默认项<TSource>(可枚举的数据源<TSource> source);
例如:

/gpl/noadditionaltext

    var numbers = new List<int> { 1, 2, 3 };  // 定义了一个包含1, 2, 3的整数列表
    var firstNumber = numbers.FirstOrDefault();   // 获取列表中的第一个元素,如果列表为空则返回默认值
    var emptyList = new List<int>();  // 定义一个空的整数列表
    var defaultNumber = emptyList.FirstOrDefault();  // 由于列表为空,因此返回默认值

当查询可能返回空结果时,这种方法特别有用,返回 nulldefault(T) 是可以接受的。

比较例子

例子 1:FirstOrDefault(返回第一个匹配项或默认值)返回的默认值

    var people = new List<Person> { new Person("John"), new Person("Jane") };  
    Person person = people.FirstOrDefault(p => p.Name == "Bob");  
    // person 会是 null,因为列表里没有 "Bob"

如果没有进行空值检查就尝试访问 person 的属性,可能会引发 NullReferenceException

例子 2:使用 First 进行空值处理的更安全的处理方式
var people = new List<Person> { new Person("John"), new Person("Jane") }; 

if (people.Any(p => p.Name == "Bob")) 
{ 
    Person person = people.First(p => p.Name == "Bob"); 
    // 处理这个人的事务 
} 
else 
{ 
    // 如果没有找到 "Bob" 
}

这种方法通过明确检查是否有一个名为"Bob"的人存在,并更安全地处理不存在的情况,避免了可能出现的null歧义。

示例 3:使用 First() 编写更安全的代码
    var numbers = new List<int> { 1, 2, 3 };  
    var firstNumber = numbers.First();    
    // 如果列表为空,将引发异常。

如果集合为空,此方法会抛出异常,这有助于在开发早期发现逻辑上的错误,而不是让代码继续运行并可能基于错误的假设盲目进行。

结论

尽管 FirstOrDefault() 在某些场景中很有用,因为它可能意外返回 null 值并降低代码的可读性,因此在现代 C# 开发中变得不太受欢迎的选择。使用 First() 或 SingleOrDefault(),或者通过 Any() 或 Count() 显式处理 null 值,能使得代码更加健壮、易读且不易出错。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消