可能重複:
Why does one often see 「null != variable」 instead of 「variable != null」 in C#?爲什麼null == myVar而不是myVar == null?
我看到它從時間到時間,我想知道這是爲什麼。有沒有什麼區別?
可能重複:
Why does one often see 「null != variable」 instead of 「variable != null」 in C#?爲什麼null == myVar而不是myVar == null?
我看到它從時間到時間,我想知道這是爲什麼。有沒有什麼區別?
避免myVar = null
(哎呦)的意外錯字是個老習慣。它在某些語言中仍然有用,但C#會保護您免於這樣做,因此在那裏沒有必要。
這是從C緩繳較舊的編譯器不會趕上這樣的:
if (foo = null)
當你的意思是這樣的:
if (foo == null)
經典笑話的例子是這樣的錯誤:
if (fireTheNukes = true)
fireTheNukes();
這通常被認爲是一種古老的模式,因爲任何值得它的鹽的編譯器都會在一個條件語句。我會在你的代碼中避免這種模式,因爲它現在沒有任何用處。
@Andrew:我認爲if(foo = null)是一個完全有效的語句(賦值給foo,然後檢查它是否爲真)。我認爲這與編譯器沒有「捕捉」它有什麼關係。 – 2009-09-20 23:45:08
@Esteban - 什麼語言和編譯器?雖然C#編譯器_will_允許在條件語句中進行布爾賦值,但它也會生成一個「你真的想要這麼做嗎?」警告。 – 2009-09-21 00:01:29
這是一個古老的防禦習慣。如果將常量放在左側,則忘記第二個等號會導致編譯錯誤。在更正常的格式中,忘記第二個等號會導致將null分配給變量。
換句話說,
myVar = null
是有害的,令人驚訝,而
null = myVar
得到由編譯器捕獲。
這是C程序員的習慣,在這種情況下,C程序員已經習慣了C#,但實際上完全沒有必要。
考慮在C中,如果您不小心鍵入if (myVar = null)
,編譯器將執行分配,而不是抱怨。圍繞myVar
和null
的順序進行切換確保如果==
無意錯誤輸入爲=
,則會生成編譯器錯誤。但是,C#在這兩種情況下都會生成編譯器警告,所以這個怪癖是不必要的。
它來自C/C++趕留出一個等號:
myVar = null
但它不是在C#中需要的。
正如其他人所提到的,這是一種針對可能由於在C和一些C衍生物(包括C#)中賦值表達式評估爲該賦值而產生的問題的防禦性策略。這是什麼讓你這樣做:
if (a = true) { /* This will always get done, as "a = true" evals to true */ }
和
int a = b = c = d = 10;
由於分配是對聯想這是有效
int a = (b = (c = (d = 10)));
其中的一對括號內的每個表達式會值,在這種情況下,10和a,b,c和d因此將全部爲10.
爲了避免潛在的錯誤 - 混合賦值和相等運算符 - 一些程序員寧願始終將常量放在左邊,就好像賦值運算符被意外使用一樣,編譯器會抱怨你不能賦值常量。
但是,這在C#中不是一個問題,原因有兩個。首先,與C不同,C#不允許將任意值解釋爲布爾值。
這在C中是必須的,因爲它沒有真正的布爾類型,它只依賴於像整數(其中0爲假和非零爲真)或指針(其中NULL爲假)的其他值的解釋。這意味着,你可以做類似
if (10) { /* This will always get done */ }
if (0) { /* This will never get done */ }
if (p) { /* This will get done is p is not null */ }
if (NULL) { /* This will never get done */ }
然而,因爲C#不允許任意表達式被解釋爲一個布爾值,這些不會在C#中工作。這也意味着,
if (a = 10) { }
不會在C#編譯,作爲表達「A = 10」的計算結果爲表達,10,其不能再被解釋爲所要求的布爾值的值。
問題的第二個原因是,在分配結果可以被解釋爲布爾值的情況下,現在小得多的百分比情況下,編譯器會發出警告以確保您確實意味着要做到這一點。
警告可以
#pragma warning disable 665
然而,這樣的代碼的存在往往是一個糟糕的代碼氣味可能是最好的重構,使代碼更清晰處理被抑制。
@devoured yep - 就是這樣。 – 2009-09-20 23:32:38
此外,這是一個習慣於說「someConst == myVar」,其中someConst在這種情況下恰好爲null的習慣。某些腳本語言可能會將上述內容翻譯爲「someConst.equals(myVar)」,如果以相反的方式進行操作,您可能會得到一個NPE。 – Bugmaster 2009-09-20 23:33:48
更正:C#不會讓你這樣做。 – Noldorin 2009-09-20 23:34:09