2012-02-05 72 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

相關問題