FirstOrDefault()
在 .NET 的 LINQ (语言集成查询) 中常用于获取序列中的第一个元素,如果序列为空,则返回默认值(对于引用类型通常是 null
,对于值类型则是 default(T)
)。
重新考虑使用 FirstOrDefault
的几个原因,FirstOrDefault
(第一个非空项):
- 目标不明确:名称
FirstOrDefault
可能会导致逻辑理解上的混淆。有时很难区分默认值(null
)是正常的还是表示错误。 - 可空性问题:使用
FirstOrDefault
可能会导致意外的NullReferenceException
,因为如果找不到匹配元素,它会返回null
。如果代码没有显式处理null
,可能会引发运行时异常。 - 性能:虽然
FirstOrDefault
对大多数情况都适用,但如果你确定集合中至少有一个元素,使用First()
(找不到元素时会抛出异常)更为合适。这有助于使代码更健壮,并尽早发现潜在错误。 - 增强代码可读性:较新的 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(); // 由于列表为空,因此返回默认值
当查询可能返回空结果时,这种方法特别有用,返回 null
或 default(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
。
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
歧义。
First()
编写更安全的代码
var numbers = new List<int> { 1, 2, 3 };
var firstNumber = numbers.First();
// 如果列表为空,将引发异常。
如果集合为空,此方法会抛出异常,这有助于在开发早期发现逻辑上的错误,而不是让代码继续运行并可能基于错误的假设盲目进行。
结论尽管 FirstOrDefault()
在某些场景中很有用,因为它可能意外返回 null 值并降低代码的可读性,因此在现代 C# 开发中变得不太受欢迎的选择。使用 First() 或 SingleOrDefault(),或者通过 Any() 或 Count() 显式处理 null 值,能使得代码更加健壮、易读且不易出错。
共同学习,写下你的评论
评论加载中...
作者其他优质文章