我有以下代码,我的同事告诉我这个代码不正确,如果我的变量为null则会崩溃:
List<FSKUser> users = null;
if (users == null || users.Count() == 0)
{
return false;
}
显然=null
仅用于测试目的。但是,当我运行此代码时,它正确运行并返回false。
我正在检查一种安全正确的检查方式吗?
答案 0 :(得分:6)
是的,这是安全和正确的方法。您的同事可能对C#:)中的运算符优先级或布尔表达式求值有一些奇怪的理解。
||
运算符(与&&
相同)将在确定结果后立即停止评估。由于布尔OR在其中一个操作数为false
时永远不会产生true
,因此它将 在第一个操作数上失败(如果它为空,则为结果是true
=&gt;您已完成),或者它将评估两个运算符。
当然,如果您不反对使用扩展方法,可以方便地使用它来简化条件。例如。你可以使用这样的扩展方法:
public static bool IsEmpty<T>(List<T> @this)
{
return @this == null || @this.Count == 0;
}
然后让你使用这样的条件:
if (users.IsEmpty())
{
...
}
另请注意,List<T>
具有Count
属性 - 您应该使用该属性而不是扩展方法Count()
。最后,它会做同样的事情IIRC(它检查可枚举是一个集合还是一个列表,IIRC),但它会经历一些循环来做到这一点。
你可能想问你的同事他认为会发生什么。你有一个简单的测试用例表明你是对的,但也许他有一些他自己为什么不想要的原因。然而,最可能的事情是他习惯了不同的编程语言,而实际上并不是本地的C#-er。在那种情况下,你们都有机会学习:)
答案 1 :(得分:0)
您的代码没有问题。如果用户不等于null
,则仅评估第二个条件,因此这是检查null的正确方法。
与其他语言(VB.NET以及And
和Or
运算符而不是AndAlso
和OrElse
)相比,C#只评估条件结果对整体结果有影响。如果 - 在您的情况下 - 逻辑或操作的第一个条件已经计算为true,则无需检查第二个条件。
答案 2 :(得分:0)
你的朋友错了。 ||
运算符短路 - 在任何字词第一次返回true
时,它会以true
退出。同样,&&
运算符会在第一次返回false
时第一次退出false
。因此,如果users.Count()
为users
,则null
无法1>}(除非,users
是一个字段并且您正在做很多事情线程,并且编译器和JIT都选择由于某种原因显式加载字段两次。)
答案 3 :(得分:0)
可能会对您的示例有用:
List<FSKUser> users = null;
return users != null && users.Any();