C# 检查变量是否为null或空的正确方法

C# 检查变量是否为null或空的正确方法,c#,null,C#,Null,我有一个同事告诉我的以下代码不正确,如果我的变量为null,它将崩溃: List<FSKUser> users = null; if (users == null || users.Count() == 0) { return false; } 列表用户=null; if(users==null | | users.Count()==0) { 返回false; } 显然,=null仅用于测试目的。但当我运行此代码时,它会正确运行并返回false 我检查的方式是安全正确的检

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

List<FSKUser> users = null;

if (users == null || users.Count() == 0)
{
   return false;
}
列表用户=null;
if(users==null | | users.Count()==0)
{
返回false;
}
显然,
=null
仅用于测试目的。但当我运行此代码时,它会正确运行并返回false


我检查的方式是安全正确的检查方式吗?

是的,这是安全正确的检查方式。您的同事可能对C#:)中的运算符优先级或布尔表达式求值有一些奇怪的理解

|
操作符(与
&&
相同)在确定结果后将立即停止计算。由于布尔OR永远不会在其中一个操作数为
true
时产生
false
,因此它将在第一个操作数上失败(如果为null,则结果为
true
=>完成),或者它将计算两个运算符

当然,如果您不反对使用扩展方法,可以方便地使用它来简化条件。例如,您可以使用如下扩展方法:

public static bool IsEmpty<T>(List<T> @this)
{
  return @this == null || @this.Count == 0;
}
if (users.IsEmpty())
{
  ...
}
另外,请注意
List
有一个
Count
属性-您可能应该使用该属性而不是扩展方法
Count()
。最后,它将做同样的事情IIRC(它检查枚举是一个集合还是一个列表,IIRC),但它会通过一些循环来完成


你可能想问问你的同事他认为会发生什么。你有一个简单的测试用例,可以证明你是对的,但也许他自己也有一些不想这样做的原因。然而,最有可能的是,他已经习惯了一种不同的编程语言,而不是真正的本地C#er。在这种情况下,你们都有机会学习:)

你们的代码没有问题。第二个条件只有在用户不等于空值时才会计算,因此这是检查空值的正确方法


与其他语言(VB.NET和
以及
操作符,而不是
以及
OrElse
)相比,C#只评估条件,只要它们的结果对整体结果有影响。如果逻辑“或”操作的第一个条件的计算结果已为true,则无需检查第二个条件

你的朋友错了。
|
运算符短路-当任何术语第一次返回
真时,它将以
退出。类似地,
&&
操作符在任何术语第一次返回
false
时以
false
退出。因此,如果
用户
,则无法访问
用户.Count()
(除非,
用户
是一个字段,并且您正在执行大量线程,并且编译器和JIT出于某种原因都选择显式加载该字段两次)。

这在您的示例中可能有用:

List<FSKUser> users = null;
return users != null && users.Any();
列表用户=null;
返回用户!=null&&users.Any();

看看,我想说他也应该使用
.Count
属性(没有括号)。有了
列表
,速度很快。Linq扩展将发现这是一个
ICollection
,并使用
Count
属性。但是,如果需要Linq,请改用
.Any()
,因为它更短、更精确,并且在底层源不是
列表时可以更快。