C#.Equals(),.ReferenceEquals()和==运算符

我对这三个人的理解是:

  • .Equals()测试数据是否相等(缺少更好的描述)。 .Equals()可以为同一对象的不同实例返回True,这是最常用的重写方法。

  • .ReferenceEquals()测试两个对象是否是相同的实例并且不能被覆盖。

  • ==默认情况下与ReferenceEquals()相同,但这可以被覆盖。

  • 但C#站点状态:

    在对象类中, EqualsReferenceEquals方法在语义上是等价的,只不过ReferenceEquals只适用于对象实例。 ReferenceEquals方法是静态的。

    现在我不明白。 任何人都可以对此有所了解吗?


    混淆的根源似乎是C#工作站提取的拼写错误,它应该是:“......除了Equals仅用于对象实例,ReferenceEquals方法是静态的。”


    你对每个语义的差异都是松散的(虽然“同一个对象的不同实例”似乎有点混淆,它应该可能读为“同一类型的不同实例”),而且关于哪个可以被覆盖。

    如果我们把它放在一边,让我们来处理你的问题的最后一点,即它们如何处理普通的System.Object实例和System.Object引用(我们需要避免==的非多态性)。 在这里,所有三个操作都可以等效,但有一点需要注意: Equals不能在null上调用。

    Equals是一个实例方法,它接受一个参数(可以为null )。 由于它是一个实例方法(必须在实际对象上调用),因此无法在null引用上调用它。

    ReferenceEquals是一个静态方法,它接受两个参数,其中任何一个都可以为null 。 由于它是静态的(不与对象实例关联),因此在任何情况下都不会抛出NullReferenceException

    ==是一个运算符,在这种情况下( object )的行为与ReferenceEquals相同。 它不会抛出NullReferenceException

    为了显示:

    object o1 = null;
    object o2 = new object();
    
    //Technically, these should read object.ReferenceEquals for clarity, but this is redundant.
    ReferenceEquals(o1, o1); //true
    ReferenceEquals(o1, o2); //false
    ReferenceEquals(o2, o1); //false
    ReferenceEquals(o2, o2); //true
    
    o1.Equals(o1) //NullReferenceException
    o1.Equals(o2) //NullReferenceException
    o2.Equals(o1) //false
    o2.Equals(o2) //true
    

    看看这个关于这个主题的MSDN文章。

    我认为有关的观点是:

    要检查引用相等性,请使用ReferenceEquals。 要检查值是否相等,请使用Equals或Equals。

    默认情况下,运算符==通过确定两个引用是否指示相同的对象来测试引用相等性,因此引用类型不需要实现operator ==以获得此功能。 当一个类型是不可变的,意味着包含在实例中的数据不能被改变,重载operator ==比较值相等性而不是引用相等可能是有用的,因为作为不可变对象,只要它们具有相同的价值。

    希望这可以帮助!


    您对.ReferenceEquals的理解是正确的。

    .Equals检查值类型的数据相等性,以及非值类型(一般对象)的引用相等性。

    。对象可以被覆盖以执行某种形式的数据相等性检查

    编辑:此外,.ReferenceEquals不能用于值类型(它可以,但将永远是假的)

    链接地址: http://www.djcxy.com/p/58485.html

    上一篇: C# .Equals(), .ReferenceEquals() and == operator

    下一篇: Ruby Set class: equality of sets