代码之家  ›  专栏  ›  技术社区  ›  baptiste

(对象)0=(对象)0

c#
  •  7
  • baptiste  · 技术社区  · 17 年前

    我想知道为什么用C#

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

    在我看来,它比较的是引用,而不是铸件的值。

    这对我来说是因为通过反射,我得到了返回一个对象的valuetype的默认值,当我将它与对象的当前值进行比较时,它返回两个值不相同,但具有相同的值。

    使用Equals或ToString可以处理ValueType对象,但不能处理可以为空的ReferenceType,因此不允许使用Equals或ToString。

    如果有人能告诉我如何比较不同的对象,这些对象可以是任何类型、空值或值,因为object==object似乎是错误的方法。是否必须将我的对象重新转换为其原始类型?在这种情况下,referenceType是否总是不同的?

    5 回复  |  直到 17 年前
        1
  •  25
  •   Jon Skeet    17 年前

    是的,这是拳击双方,并比较参考。每次装箱时都会创建一个新对象,因此引用是不同的。

    Equals 方法是一种方法,考虑到无效性。最简单的方法是使用静态 object.Equals(object, object) 方法:

    if (object.Equals(x, y))
    {
        ...
    }
    
        2
  •  4
  •   n8wrl    17 年前

    你在拳击,所以“演员表”确实为每个人创建了一个新对象。如果要与对象进行比较,可能需要编写自己的.equals实现。

        3
  •  0
  •   ristonj    17 年前

    基本上,上面创建了两个对象引用,将它们存储在内存的不同位置,然后比较内存地址。因为这个原因,每次都会返回false。

    比较我所知道的两个对象的唯一方法是检查一个或两个对象是否为空(如果一个对象为空而另一个不为空,则它们不相等;我将其留给您的实现来确定是否为空==空)。如果两者都不为空,则可以安全地在对象上调用.equals。

        4
  •  0
  •   Fredrik Mörk    17 年前

    强制转换将强制装箱,这实质上创建了新对象,然后比较引用。如果要按内容比较对象(使用引用指向的对象的实现比较),则应使用equals方法:

    Console.Write(((object)0).Equals((object)0)); // outputs "True"
    
        5
  •  0
  •   quillbreaker    17 年前

    这可能会澄清一些事情。

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