检查变量是空还是空的正确方法

时间:2014-03-31 07:08:20

标签: c# null

我有以下代码,我的同事告诉我这个代码不正确,如果我的变量为null则会崩溃:

List<FSKUser> users = null;

if (users == null || users.Count() == 0)
{
   return false;
}

显然=null仅用于测试目的。但是,当我运行此代码时,它正确运行并返回false。

我正在检查一种安全正确的检查方式吗?

4 个答案:

答案 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以及AndOr运算符而不是AndAlsoOrElse)相比,C#只评估条件结果对整体结果有影响。如果 - 在您的情况下 - 逻辑或操作的第一个条件已经计算为true,则无需检查第二个条件。

答案 2 :(得分:0)

你的朋友错了。 ||运算符短路 - 在任何字词第一次返回true时,它会以true退出。同样,&&运算符会在第一次返回false时第一次退出false。因此,如果users.Count()users,则null 无法}(除非,users是一个字段并且您正在做很多事情线程,并且编译器和JIT都选择由于某种原因显式加载字段两次。)

答案 3 :(得分:0)

可能会对您的示例有用:

List<FSKUser> users = null;
return users != null && users.Any();