if(args.Length< 1)和if之间的区别(args.Length == 0 || args == null)

时间:2016-12-14 00:45:57

标签: c# visual-studio-2015 parameter-passing

我很想知道哪一个更好用,因为我必须再次在c#的代码中再次检查它

if(args.Length<1) //i use

vs

if(args.Length == 0 || args == null)

作为候补。

或vs如果可能的话

if (args.exists) // or more simple?

4 个答案:

答案 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,那么它将检查下一个条件并且不会抛出任何异常。

因此,请牢记这些规则并巧妙地设置您的条件。