2009-06-05 45 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

相关问题