==評估和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
==評估和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
根據規範,這是預期的行爲。
第一行爲由該規範的第7.3節支配:
操作數中的表達從左至右進行評估。例如,在
F(i) + G(i++) * H(i)
中,使用舊值i調用方法F,然後使用舊值i調用方法G,最後使用新值i調用方法H.這與運營商優先權是分開的並且與運營商優先權無關。
因此,在x==x++
,第一左操作數進行評估(0
),則右手進行評估(0
,x
變得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
,可變),則參數被評估(0
,x
變得1
),則比較完成:x.Equals(0)
是假的。
編輯:我也想給dtb的現在收回的評論,在問題被關閉時發佈的功勞。我認爲他說的是同樣的事情,但由於評論篇幅限制,他無法充分表達。
評價的順序。 ++首先評估(第二個例子)。但在第一個例子中,==首先執行。
我不同意試試看,看編輯部分 – 2010-10-06 11:11:11
哇!我無法相信我的眼睛...我會盡快回復你 – Aliostad 2010-10-06 12:02:21
Sure Anytime ....但輸出將保持不變,即使你在一年之後... :) – 2010-10-06 17:02:55
@版主:在結束任何問題之前閱讀完整的問題。如果您有權關閉任何問題,請在正確的地方使用它們。 – 2010-10-06 11:12:59
@JørnSchou-Rode,Arcturus,Oded,Pandiya Chendur,GregS:既然你們都投了票來結束這個問題。請爲上面提出的問題提供適當的答案或重新打開問題。 – 2010-10-06 17:00:45