First()在集合为空时抛InvalidOperationException,FirstOrDefault()返回默认值;二者语义不同:前者断言“必须存在”,后者处理“可能不存在”场景,误用会导致500错误或逻辑错误。First 和 FirstOrDefault 用错会直接抛异常当集合为空时,First() 立刻抛出 InvalidOperationException:“序列中不包含任何元素”;而 FirstOrDefault() 返回类型的默认值(比如 null 对于引用类型,0 对于 int)。这不是“更安全”的替代,而是语义完全不同:你是在明确要求“必须存在第一个”,还是“可能没有,那就给个默认”。常见错误现象:? 在 Web API 返回分页列表前取 First(),但数据库查不到数据 → 500 错误? 对 IEnumerable<int> 调用 FirstOrDefault() 后直接做数学运算,没检查是否为 0(实际是空集合导致的假 0)如果业务逻辑依赖“一定有首个元素”(例如配置项非空校验),就用 First() —— 异常反而是好事,暴露数据问题如果属于“尝试获取,失败可降级”(比如查用户头像 URL,没找到就用默认图),必须用 FirstOrDefault()对可空引用类型(如 string),FirstOrDefault() 返回 null;对不可空值类型(如 int),返回 0,不是 default(int?) —— 注意别和 First()??.ToString() 混淆带条件的 First(x => ...) 和 FirstOrDefault(x => ...) 行为一致加谓词后,两者依然遵循“找不到就炸” vs “找不到就返默认”的规则。但容易被忽略的是:谓词执行时机和短路逻辑。使用场景:? 查找状态为 Active 的第一个订单? 从日志集合中取最近一条错误日志谓词只在遍历到每个元素时才执行,不会预扫描整个集合 —— 所以即使集合很大,只要第一个匹配项靠前,性能就很好如果用 Where(...).First(),等价于 First(...),但多一次迭代开销(先过滤再取首);直接用带谓词的 First(...) 更高效注意谓词里别有副作用(比如修改外部变量),因为 LINQ 是延迟执行,且可能因优化不执行全部元素FirstOrDefault 返回 default(T) 时,值类型判断要小心对 int、DateTime、Guid 这类值类型,FirstOrDefault() 返回的是语言定义的 default(T),不是“未设置”状态。这意味着你无法区分“找到了值为 0 的元素”和“根本没找到”。 Shakespeare 一款人工智能文案软件,能够创建几乎任何类型的文案。
C#怎么使用LINQ First和FirstOrDefault C#First和FirstOrDefault的区别什么时候用哪个【语法】
最新推荐文章于 2026-06-24 20:29:46 发布

829

被折叠的 条评论
为什么被折叠?



