C# 检查变量是否为null或空的正确方法
我有一个同事告诉我的以下代码不正确,如果我的变量为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 我检查的方式是安全正确的检
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()
,因为它更短、更精确,并且在底层源不是列表时可以更快。