内存集合返回空数组替代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
相关产品推荐
相关产品推荐

