2010-10-06 81 views
14

==評估和C#中的等於之間有什麼區別?== vs等於C#

對於防爆,

if(x==x++)//Always returns true 

if(x.Equals(x++))//Always returns false 

編輯:

 int x=0; 
    int y=0; 

    if(x.Equals(y++))// Returns True 
+12

@版主:在結束任何問題之前閱讀完整的問題。如果您有權關閉任何問題,請在正確的地方使用它們。 – 2010-10-06 11:12:59

+4

@JørnSchou-Rode,Arcturus,Oded,Pandiya Chendur,GregS:既然你們都投了票來結束這個問題。請爲上面提出的問題提供適當的答案或重新打開問題。 – 2010-10-06 17:00:45

回答

12

根據規範,這是預期的行爲。

第一行爲由該規範的第7.3節支配:

操作數中的表達從左至右進行評估。例如,在F(i) + G(i++) * H(i)中,使用舊值i調用方法F,然後使用舊值i調用方法G,最後使用新值i調用方法H.這與運營商優先權是分開的並且與運營商優先權無關。

因此,在x==x++,第一左操作數進行評估(0),則右手進行評估(0x變得1),則比較完成:0 == 0是真實的。

第二的行爲是由節7.5.5支配:

  • 如果M處於值型聲明的實例函數成員:
    • 計算E.如果評估導致異常,則不執行進一步的步驟。
    • 如果E未被分類爲變量,則創建E類型的臨時局部變量,並將E的值分配給該變量。 E然後被重新分類爲對該臨時局部變量的參考。臨時變量在M中是可以訪問的,但不能以其他方式訪問。因此,只有當E是真實變量時,主叫纔有可能觀察到M對此做出的變化。
    • 參數列表按照§7.5.1中的描述進行評估。
    • M被調用。由E引用的變量成爲由此引用的變量。

注意值類型通過引用傳遞給自己的方法。

因此,在x.Equals(x++),第一目標被評估(E是x,可變),則參數被評估(0x變得1),則比較完成:x.Equals(0)是假的。

編輯:我也想給dtb的現在收回的評論,在問題被關閉時發佈的功勞。我認爲他說的是同樣的事情,但由於評論篇幅限制,他無法充分表達。

4

評價的順序。 ++首先評估(第二個例子)。但在第一個例子中,==首先執行。

+1

我不同意試試看,看編輯部分 – 2010-10-06 11:11:11

+2

哇!我無法相信我的眼睛...我會盡快回復你 – Aliostad 2010-10-06 12:02:21

+2

Sure Anytime ....但輸出將保持不變,即使你在一年之後... :) – 2010-10-06 17:02:55