我在C#中有以下代码:
if (this.Trucks.Any() || this.Cars.Any())
{
return true;
}
return false;
但我刚刚意识到有时这些数组中的一个或任何一个是null,所以在我的情况下,我想null只返回false(而不是抛出异常)。
我可以像这样添加前期空检查:
if ((this.Trucks != null && this.Trucks.Any()) ||
(this.Cars != null && this.Cars.Any()))
{
return true;
}
return false;
}
但想看看是否有更清洁的方式
答案 0 :(得分:4)
如果你想将空序列作为空序列进行交换,我会创建一个扩展方法:
public static class Seq
{
public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> seq)
{
return seq ?? Enumerable.Empty<T>();
}
}
return this.Trucks.EmptyIfNull().Any() || this.Cars.EmptyIfNull().Any()
如果您不想使用处理空值的扩展方法,则可以删除this
修饰符并使用
return Seq.EmptyIfNull(this.Trucks).Any() || Seq.EmptyIfNull(this.Cars).Any()
答案 1 :(得分:4)
我建议你尽可能地保持非空契约(空对象模式)。这意味着您可能会在构造函数空数组(Enumerable.Empty<T>()
中初始化IEnumerable
- 如果是数组add .ToArray()
)。空检查的问题通常是在代码上传播和相乘 - 代码(和单元测试)的复杂性不必要地增加。忘记在x
个地方检查空值比忘记在一个地方初始化空对象更容易。您还可以使用Code contracts
库在运行时检查“合同”。事实上,“null
”的发明者称这是十亿美元的错误:"Null References: The Billion Dollar Mistake"
答案 2 :(得分:2)
制作自己的实施:
public static Class StaticHelpers
{
public static bool AnyEx<T>(this IEnumerable<T> enumerable)
{
if (enumerable == null) return false;
return enumerable.Any();
}
}
像这样使用:
if (this.Trucks.AnyEx() || this.Cars.AnyEx())
{
return true;
}
return false;
答案 3 :(得分:1)
如何在主if
条件下检查它们:
if ((this.Trucks != null && this.Trucks.Any()) ||
(this.Cars != null && this.Cars.Any()))
{
return true;
}
return false;
这可以改写成一条长行:
return ((this.Trucks != null && this.Trucks.Any()) ||
(this.Cars != null && this.Cars.Any()));