2009-09-20 101 views

回答

20

避免myVar = null(哎呦)的意外錯字是個老習慣。它在某些語言中仍然有用,但C#會保護您免於這樣做,因此在那裏沒有必要。

+0

@devoured yep - 就是這樣。 – 2009-09-20 23:32:38

+0

此外,這是一個習慣於說「someConst == myVar」,其中someConst在這種情況下恰好爲null的習慣。某些腳本語言可能會將上述內容翻譯爲「someConst.equals(myVar)」,如果以相反的方式進行操作,您可能會得到一個NPE。 – Bugmaster 2009-09-20 23:33:48

+0

更正:C#不會讓你這樣做。 – Noldorin 2009-09-20 23:34:09

8

這是從C緩繳較舊的編譯器不會趕上這樣的:

if (foo = null) 

當你的意思是這樣的:

if (foo == null) 

經典笑話的例子是這樣的錯誤:

if (fireTheNukes = true) 
    fireTheNukes(); 

這通常被認爲是一種古老的模式,因爲任何值得它的鹽的編譯器都會在一個條件語句。我會在你的代碼中避免這種模式,因爲它現在沒有任何用處。

+0

@Andrew:我認爲if(foo = null)是一個完全有效的語句(賦值給foo,然後檢查它是否爲真)。我認爲這與編譯器沒有「捕捉」它有什麼關係。 – 2009-09-20 23:45:08

+0

@Esteban - 什麼語言和編譯器?雖然C#編譯器_will_允許在條件語句中進行布爾賦值,但它也會生成一個「你真的想要這麼做嗎?」警告。 – 2009-09-21 00:01:29

2

這是一個古老的防禦習慣。如果將常量放在左側,則忘記第二個等號會導致編譯錯誤。在更正常的格式中,忘記第二個等號會導致將null分配給變量。

換句話說,

myVar = null 

是有害的,令人驚訝,而

null = myVar 

得到由編譯器捕獲。

2

這是C程序員的習慣,在這種情況下,C程序員已經習慣了C#,但實際上完全沒有必要。

考慮在C中,如果您不小心鍵入if (myVar = null),編譯器將執行分配,而不是抱怨。圍繞myVarnull的順序進行切換確保如果==無意錯誤輸入爲=,則會生成編譯器錯誤。但是,C#在這兩種情況下都會生成編譯器警告,所以這個怪癖是不必要的。

2

它來自C/C++趕留出一個等號:

myVar = null 

但它不是在C#中需要的。

1

正如其他人所提到的,這是一種針對可能由於在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 

然而,這樣的代碼的存在往往是一個糟糕的代碼氣味可能是最好的重構,使代碼更清晰處理被抑制。

相關問題