You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

内存集合返回空数组替代Null,规避IEnumerable空引用异常的技术问询

最佳实践:返回空集合而非 Null 处理 IEnumerable

绝对应该返回空集合而非 Null!这是.NET生态里处理集合类型返回值的公认最佳实践,能从根源上避免忘记Null检查导致的空引用异常,还能大幅简化调用方的代码逻辑。

为什么这么做?

  • 简化调用代码:调用方再也不用写orders == null || !orders.Any()这种双重判断逻辑了。空集合的Any()方法会直接返回false,直接遍历空集合也不会抛出任何异常——根本不需要处理特殊的Null分支。
  • 符合空对象模式:让返回值始终保持可操作的一致状态,调用方可以放心地对返回的集合调用任何LINQ方法或者进行遍历,不用额外做Null校验,代码更简洁健壮。
  • 消灭潜在bug:很多时候开发者在快速开发、重构或者多人协作时,很容易忘记加上Null检查。返回空集合能彻底杜绝这类低级但棘手的空引用异常。

修改后的代码示例

把原方法中返回Null的地方替换成空集合(推荐用Enumerable.Empty<T>(),它是一个预缓存的静态空实例,比新建空数组更高效):

public IEnumerable<Order> GetOrdersByServiceName(string serviceName) { 
    // 注意:原代码逻辑似乎写反了?这里调整为"服务无效则返回空集合"
    if (!IsValidService(serviceName)) 
        return Enumerable.Empty<Order>(); 
        
    var orders = GetValidOrder(serviceName); 
    // 额外保险:如果GetValidOrder也可能返回Null,用空合并运算符兜底
    return orders ?? Enumerable.Empty<Order>(); 
}

调用方的代码会变得更简洁

现在调用方不需要再做Null检查,直接处理集合即可:

var orders = GetOrdersByServiceName("TestService"); 

// 判断是否有订单
if (!orders.Any()) {
    // 处理无订单的逻辑
}

// 直接遍历,空集合不会执行任何循环体
foreach (var order in orders) {
    // 处理单个订单
}

内容的提问来源于stack exchange,提问作者Mazaher Bazari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:40:24