为什么不应再使用 FirstOrDefault

科技   2024-11-03 08:00   广东  

FirstOrDefault()通常用于 .NET 中的 LINQ(语言集成查询)中,以检索序列的第一个元素,或者如果序列为空,则检索默认值(通常用于引用类型或值类型)。nulldefault(T)

重新考虑使用的原因 :FirstOrDefault

  1. 意图不明确:该名称可能会导致对逻辑的误解。并不总是清楚默认值 () 是预期的还是表示错误条件。FirstOrDefaultnull

  2. 可为 Null 性问题:Using 可能会无意中导致,因为它可能会在找不到匹配元素时返回。如果代码未显式处理 ,则可能会导致运行时异常。FirstOrDefaultNullReferenceExceptionnullnull

  3. 性能:虽然在大多数情况下都有效,但当您确定集合至少包含一个元素时,using (在找不到元素时引发异常) 更合适。它还有助于提高代码的防御性,并更早地捕获潜在错误。FirstOrDefaultFirst()

  4. 改进的代码可读性:较新的 C# 版本和模式鼓励使用可为 null 的引用类型 () 和模式匹配等功能更好地处理可为 null 性,从而减少不必要的使用并促进更具表现力的替代方法。T?FirstOrDefault

替代品FirstOrDefault

用途 :First()

如果你确定至少有一个元素,并且你想要确保在没有元素时引发异常,则是更合适的选择。这将强制执行假设并避免静默传递 .First()null

var firstItem = list.First(); // Throws an exception if the list is empty

用途 :SingleOrDefault()

如果你期望只有一个项目,但希望确保存在不超过一个项目,则更严格。如果找到多个项目,则会引发异常。SingleOrDefault()

var singleItem = list.SingleOrDefault(); // Ensures only one item, returns default if empty

显式 Null 检查

而不是 using and risking ,考虑使用 or 预先显式处理空情况,这可以使您的意图更清晰:FirstOrDefaultnullAny()Count()

if (list.Any())  
{
var firstItem = list.First();
}
else
{
// Handle empty list case
}

的来源FirstOrDefault

FirstOrDefault()是 C# 中 LINQ(语言集成查询)扩展的一部分。它广泛用于查询序列,例如 .当 LINQ 被添加到语言中时,它是作为 .NET 3.5 的一部分引入的,旨在提供更具声明性和可读性的查询集合。IEnumerable<T>

如何使用FirstOrDefault

FirstOrDefault()通常用于检索集合的第一个元素,或者在集合为空或未找到匹配元素时返回默认值。以下是它的典型使用方式:

TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source);

使用示例:

var numbers = new List<int> { 1, 2, 3 };  
var firstNumber = numbers.FirstOrDefault();
var emptyList = new List<int>();
var defaultNumber = emptyList.FirstOrDefault();

当查询结果可能为空且返回 or 是可接受的集合时,该方法特别有用。nulldefault(T)

比较示例

示例 1:返回默认值FirstOrDefault

var people = new List\<Person> { new Person("John"), new Person("Jane") };  
Person person = people.FirstOrDefault(p => p.Name == "Bob");
// person will be null because "Bob" doesn't exist in the list

在这种情况下,如果您尝试访问未进行 null 检查的属性,则可能会导致 。FirstOrDefaultNullReferenceExceptionperson

示例 2:使用 Null 处理的更安全方法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");
// Do something with person
}
else
{
// Handle case where "Bob" is not found
}

此方法通过显式检查是否存在名为 “Bob” 的人并更安全地处理空 case 来避免返回的歧义。null

示例 3:用于更具防御性的代码First

var numbers = new List<int> { 1, 2, 3 };  
var firstNumber = numbers.First();
// Will throw an exception if the list is empty

如果集合为空,此方法将引发异常,这有助于在开发的早期识别逻辑错误,而不是允许代码继续进行可能不正确的假设。

虽然在某些情况下很有用,但在现代 C# 开发中,它变得越来越不受欢迎,因为它可能会导致意外值和降低代码清晰度。替代方法(如 , 或通过 or 进行显式 null 处理)可以使代码更加健壮、可读性和抗错性。


推荐阅读:
在 .NET 中使用文件和流(针对 .NET 8 /9 更新)
在 .NET 中使用日期和时间(针对 .NET 8/9 更新)
2款.NET开源且高效的代码格式化工具
一个适用于 ASP.NET Core 的轻量级插件框架
面试常考:彻底搞清楚C#垃圾回收机制(GC)
在 .NET 和 Python 中创建了相同的 API — 哪个性能更好?

点击下方卡片关注DotNet NB

一起交流学习

▲ 点击上方卡片关注DotNet NB,一起交流学习

请在公众号后台

回复 【路线图】获取.NET 2024开发者路线
回复 【原创内容】获取公众号原创内容
回复 【峰会视频】获取.NET Conf大会视频
回复 【个人简介】获取作者个人简介
回复 【年终总结】获取作者年终回顾
回复 加群加入DotNet NB 交流学习群

长按识别下方二维码,或点击阅读原文。和我一起,交流学习,分享心得。

DotNet NB
.NET 技术学习分享,社区热点分享,专注为 .NET 社区做贡献,愿我们互相交流学习,共同推动社区发展
 最新文章