2012-07-06 317 views
43

如果我有一个If声明有两个条件 - 第一个失败,第二个条件是否会被考虑或将直接进入else?那么,在下面的例子中,如果myList.Count == 0,将myString与“价值”进行比较,还是只是直接到else如果IF语句不符合第一个条件,IF语句是否会停止评估?

if(myList.Count > 0 && myString.Equals("value")) 
{ 
//Do something 
} 
else 
{ 
//Do something else 
} 
+7

C#中的*布尔逻辑运算符*是“short circuiting”。那里有很多关键字。 – 2012-07-06 08:30:55

+1

请注意,这不是执行此操作的'if'语句,它是AND和OR boolan操作符的属性。 – unwind 2012-07-06 08:33:06

回答

67

它将停止评估,因为您使用的是双符号运算符& &。这叫做short-circuiting

如果你把它改成一个符号:

if(myList.Count > 0 & myString.Equals("value")) 

它会同时评估。

+0

非常感谢Paul,+1。你什么时候真的想要使用&运算符(例如,如果第一个条件是错误的,你甚至想查看第二个)? – 2012-07-06 08:33:11

+4

在这种情况下你当然不会。如果你的第二个条件是一个函数调用,你可以使用它来执行一些你想要发生的更新(不过我不知道你为什么要这么做)。 – 2012-07-06 08:38:10

+1

@DeeMac考虑代码:'public bool DoAllWork(){return DoWork()&DoExtraWork(); }'因为我们使用单个'&',即使第一个方法调用('DoWork()')返回'false',额外的工作也会完成。如果我们使用'&&',那么额外的工作只会在第一次调用返回true的时候完成。但是,大多数程序员从不使用带有布尔运算符的'&'运算符。对于整数类型(保存比1位更多的信息),这是另一回事。 – 2012-07-06 09:28:27

16

不,它不会被考虑。 (这被称为short circuiting

编译器是足够聪明(和语言规范要求),要知道,如果第一个条件是false,没有办法表达式会true

而且当Jacob指出||时,当第一个条件是true时,第二个条件将不被评估。

+2

反之亦然|| - 如果第一个选项为“true”,则不会评估第二个选项。 – 2012-07-06 08:31:00

+0

我更新了答案以反映@JacobRaihle评论。 – MBen 2012-07-06 08:32:58

3

没有,如果你使用&&

如果使用&将被视为

+0

啊对,没有意识到,即使是一个诚实的运营商。 – 2012-07-06 08:31:38

1

在您的例子第二个条件将被跳过,第二条语句将仅在第一个失败评估。当两个操作数都为真时,逻辑AND &&将仅返回true,即短路评估

7

如果逻辑运算符是AND(& &),那么IF语句将评估第一个表达式 - 如果第一个表达式为false,则不会评估第二个表达式。这对于在引用方法上检查变量是否为空有用,以避免空指针异常

如果逻辑运算符是OR(||),那么IF语句将评估第一个表达式 - 如果第一个表达式为真,它不会评估第二个。

编译器和运行时都对这种行为优化

1

.NET支持short circuiting所以当第一个条件去失败,也不会检查第二condtion ....在C#||和& &是逻辑运营商的短路版本|和&分别....它往往是更快的太...

2

考虑如下因素:

static int? x; 
static int? y; 

static void Main(string[] args) 
{ 
    x = 5; 
    if (testx() & testy()) 
    { 
     Console.WriteLine("test"); 
    } 
} 

static Boolean testx() 
{ 
    return x == 3; 
} 

static Boolean testy() 
{ 
    return y == 10; 
} 

如果跟踪过两个testx和暴躁的功能,即使testx是假的evaulated。

如果将测试更改为& &只检查第一个。