2011-02-10 16 views
7

有以下兩個語句條件語句差分

if (null != obj) 

if (obj != null) 

如果兩個處理相同的,這將是最好有什麼區別?

+7

它們可以是不同的,如果一個白癡推翻!=運算符。 – CodesInChaos 2011-02-10 13:43:26

回答

7

這裏的區別是生成的代碼。這兩者不會生成完全相同的代碼,但實際上這兩個陳述的結果或表現沒有關係。

但是,如果您創建自己的類型,並重寫不等式運算符,並做一個糟糕的工作,那麼它會很重要。

考慮一下:

public class TestClass 
{ 
    ... 

    public static bool operator !=(TestClass left, TestClass right) 
    { 
     return !left.Equals(right); 
    } 
} 

在這種情況下,如果第一個參數的經營者爲空,即。 if (null != obj),那麼它會崩潰與NullReferenceException

因此,要總結:產生

  • 的代碼是不同的
  • 性能和最終結果應該是相同的
    • 除非你已在所涉及的類型斷碼

現在,我想你問的原因是,你見過代碼C,W通常有這樣的代碼:

if (null == obj) 

請注意,我切換到相等檢查在這裏。原因在於用舊的C編譯器編寫的程序中的一個頻繁的錯誤(現在他們傾向於解決這個問題)將會切換它並忘記其中一個相同的字符,即。此:

if (obj = null) 

此分配null到變量,而不是比較它的。解決這個問題的最好方法就是切換它,因爲你不能指定任何東西到null,它不是一個變量。即。這將無法編譯:

if (null = obj) 
2

不,沒有。完全一樣。

風格null == obj有時只是用來防止常見錯字obj = null不意外null分配給一個變量,但!=但絕對沒有理由這樣做。

在.NET中,它不會實際編譯輸入錯誤obj = null
所以編譯器可以防止你意外地做到這一點。

Yoda condition最初來自其他語言,缺少此編譯器功能。

+0

如果你不小心使用`=`來替代`==`,編譯器會發出警告。 – LukeH 2011-02-10 13:45:11

+0

是的,我只是想補充說.NET。 – 2011-02-10 13:45:53

4

不,但第二種方式更普遍,更可讀(在我看來更符合邏輯)

20

第一種是Yoda條件。使用它你不應該。

1

它們完全一樣。

有些人喜歡把null作爲表達的第一部分,以避免類似

if (obj = null) // should be obj == null 

但是,當然,這並不適用於!=操作,所以在你的榜樣,它只是一個錯誤風格的差異。

0

使用第一種形式

if (blah == obj) 

從天莖時,編譯器不會趕上if (obj = blah)即無意轉讓,除非編譯警告級別設置爲最大

0

聲明的第一類從C/C++,在那裏有可能通過不布爾值狀況檢查來了。例如。任何不是0就是如此,零是假的:

if (5) { } // true 
if (0) { } // false 

有時它造成的問題,如果你忘了輸入一個「=」字符:

if (x = 5) { } // this was true always and changed x value 
if (x == 5) { } // this was true, if x was equal to 5 

因此,使用尤達語法,收到編譯器在情況下,一個 '=' 錯誤被錯過:

if (5 = x) { } // this was generating compiler error for absent-minded programmers 
if (5 == x) { } // this was true, if x was equal to 5 

C#允許在條件只有布爾值,所以

if (x = 5) { } // this won't compile 
if (x == 5) { } // this is true, if x was equal to 5 

什麼布爾類型?

if (y = true) { } 
if (y == true) { } 

嗯,這是無用的代碼,因爲你可以寫if(y)。 結論:Yoda語法隨C/C++一起消失了,您不必再使用它了。