2009-06-05 48 views
7

我很奇怪,爲什麼在C#(對象)== 0(對象)0

0 == 0     // return true 
(object) 0 == (object) 0 // return false 

對我來說,它看起來像它的參考,而不是比較比較塑像的價值。

這對我來說是因爲使用Reflection我得到的ValueType返回一個對象的默認值,當我將它與我的對象的當前值進行比較時,它返回的值不同,但具有相同的值。

使用Equals或ToString在ValueType對象上工作,但不能與ReferenceType一起使用,該類型可以爲null,因此不允許Equals或ToString。

如果有人能告訴我如何比較不同的對象,可以是任何類型,空值或值,因爲對象==對象似乎是錯誤的路要走。我有義務將我的對象改寫爲原始類型,在這種情況下,ReferenceType總是不同的?

+1

http://msdn.microsoft.com/en-us/library/yz2be5wk(VS.71).aspx(裝箱參考) – meandmycode 2009-06-05 19:06:35

回答

25

是的,它是拳擊雙方,並比較參考。每次你在框中創建一個新的對象,所以引用是不同的。

Equals方法比較的方法是考慮到無效性。最簡單的方法是使用靜態object.Equals(object, object)方法:

if (object.Equals(x, y)) 
{ 
    ... 
} 
4

你在裝箱,所以'cast'確實會爲每個物品創建一個NEW對象。如果您正在與您的對象進行比較,則可能需要編寫自己的.Equals實現。

0

基本上,上面創建兩個對象的引用,在不同的位置將它們存儲在存儲器中,然後比較存儲器地址。由於這個原因,每次都會返回false。

比較兩個我知道的對象的唯一方法是檢查一個或兩個對象是否爲空(如果一個爲空而不是另一個,它們不相等;我將它留給您的實現來確定是否null == null)。如果兩者都不爲空,則可以安全地在對象上調用.equals。

0

演員將強制拳擊,這基本上會創建新的對象,然後參考進行比較。如果你想通過內容比較對象,而不是(使用引用指向的對象執行的比較),你應該使用Equals方法:

Console.Write(((object)0).Equals((object)0)); // outputs "True" 
0

這可能有助於澄清事情有點。

object zero =(object)0; return(object.Equals(zero,zero)); //返回true

相關問題