2012-02-05 59 views
2

鉴于典型的编码咒语是“不要在方法调用中诱发副作用”。并且唯一的原因(我知道 - 请指教我,如果我错了)不使用短路操作符的时候,是在随后的代码中依赖方法调用的副作用。为什么C#和VB.NET等语言中的默认运算符不是短路版本?为什么不将短路操作员设为默认

IE:

if (Method1() & Method2()) { 
} 

if Method1 And Method2 then 
End if 

if (Method1() | Method2()) { 
} 

if Method1 Or Method2 then 
End if 

实际上(默认)意味着

if (Method1() && Method2()) { 
} 

if Method1 AndAlso Method2 then 
End if 

if (Method1() || Method2()) { 
} 

if Method1 OrElse Method2 then 
End if 
+1

C#确实使用短路评估。这就是说,这个问题看起来像是一个重复的http://stackoverflow.com/questions/1445867/why-would-a-language-not-use-short-circuit-evaluation – jjlin 2012-02-05 06:09:16

回答

0

那么有两个不同的理由和两个不同的答案,我认为。

对于C#(以及大多数相关的旧语言),单连字符或单管道实际上对变量执行按位运算(按位与逻辑相对)。这就是为什么在所有C/C++代码中,当有人想要逻辑和时,您将在其代码中看到双重符号。

对于VB.NET我相信答案只是历史。传统基本语言一直使用“和”和“或”来执行非短路操作。这是一个非常糟糕的决定,但一直持续到VB.NET。

它确实提到所有基本语言都使用“和/或”关键字来进行按位操作。在较老的基础知识中,没有AndAlso或OrElse关键字的等价关系来强制短路,所以你必须嵌套If语句以获得短路的逻辑等价物。

+2

不,在C#中的单|和&运营商在布尔工作就好了。他们是bools上的逻辑运算符,ints上是按位运算符。对bools *的逻辑运算也不要求短路。 – 2012-02-05 08:59:06

+0

他们在布尔值上工作。我只是说他们即使在对布尔值使用时也会执行按位操作。当您使用单个&或|时在一系列布尔值上,它使用按位运算并将它们视为一系列要评估的1位值。这是解释者如何实施运营商。 – EverPresent 2012-02-05 13:47:26

+1

虽然很明显是,解释器是如何实现这一功能的,但将布尔逻辑的逻辑运算视为“按位”是有点奇怪的。人们通常认为“按位”操作是在一系列位上进行操作,而不是在一个布尔值上进行操作。事实上,实际上布尔没有实现为单个位是实现细节。 – 2012-02-05 17:04:04

相关问题