我很想知道哪一个更好用,因为我必须再次在c#的代码中再次检查它
if(args.Length<1) //i use
vs
if(args.Length == 0 || args == null)
作为候补。
或vs如果可能的话
if (args.exists) // or more simple?
答案 0 :(得分:6)
如果NullReferenceException
为空,则第一种形式可能会遇到args
- 您不能访问其Length
属性。
第二种形式应该颠倒正确:
if (args == null || args.Length == 0) ...
第三种形式在语法上是不正确的。你可能会想到LINQ函数Any
:
if (args.Any()) ...
但是你必须首先测试null。
我不清楚你究竟在测试什么。如果要检查数组中是否有某些内容,则条件应如下所示:
if (args != null && args.Length > 0)
{
// Free to access args[0] here
}
答案 1 :(得分:3)
实际上两者都有问题。
if(args.Length == 0 || args == null)
实际应该是
if(args == null || args.Length == 0)
如果args为null,则第一个将抛出NullReferenceException。第二个不会由于C#的短路行为(因为一旦它看到args为null,它将停止评估表达式)。那个bug也影响了这个:
if(args.Length<1)
说完了,
if(args == null || args.Length == 0)
的行为与
相同if(args == null || args.Length<1)
但我认为第一个更清楚。
答案 2 :(得分:3)
如果args为string[]
,您可以使用。您正在使用Null-Conditional Operator,并且需要使用C#6.0
if(args?.Any() == true)
{
//the code will go in this block if args != null and args has items in it.
}
编辑:如评论中所述,这适用于每个IEnumerable<T>
答案 3 :(得分:1)
当C#进行&&
检查时,它将从左边开始评估,如果第一个条件为真,它将检查右边的其他条件。如果它是假的,它将不会费心检查其余的。这被称为“短路”。
如果正在进行||
,它将从左侧开始,只要其中一个条件为真,就不会检查其余条件。
您有以下代码:
if(args.Length == 0 || args == null)
C#将首先检查args.Length
,并猜测如果args为null将会发生什么。异常。
如果你切换它们,它会首先检查args == null
,如果是,如果你正在做||
它将停止而不执行下一次检查。如果它不为null,那么它将检查下一个条件并且不会抛出任何异常。
因此,请牢记这些规则并巧妙地设置您的条件。