LINQ表达式中如何最优处理null对象以避免空引用异常
解决方案
最优方案(C# 6及以上版本)
直接使用空条件运算符?.+空合并运算符??处理null场景,代码改动量最小,可读性和性能都无损失:
// 注意Array.Empty的泛型类型要和TravelRouteId的实际类型匹配,示例中假设为Guid var TravelRoute = MyData.TravelRouteByName( parameters.Directions ?.Where(p => p.TravelRouteId != null) .Select(p => p.TravelRouteId.Value) .Distinct() .ToArray() ?? Array.Empty<Guid>() );
原理解释
- 空条件运算符
?.会先校验parameters.Directions是否为null,为null时直接中断后续LINQ链式调用,返回null,不会触发Where方法对source参数的非空校验,避免抛出异常 - 空合并运算符
??会在前序调用返回null时,回退返回指定的空数组,保证传入TravelRouteByName的参数永远为非空数组,符合方法的参数要求
兼容低版本C#方案(C# 5及以下)
如果运行环境不支持空条件运算符,可以用三元运算符提前做null判断:
var routeIdList = parameters.Directions == null ? Array.Empty<Guid>() : parameters.Directions .Where(p => p.TravelRouteId != null) .Select(p => p.TravelRouteId.Value) .Distinct() .ToArray(); var TravelRoute = MyData.TravelRouteByName(routeIdList);
内容的提问来源于stack exchange,提问作者StackTrace
相关产品推荐
相关产品推荐

