如何检查对象是否等于同一类的新对象?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (74)

如果我有这样的对象:

public class Person
{
    public int id {get;set;}
    public string name {get;set;}
}

我想要这种行为:

Person a = new Person();
Person b = new Person();

a == b;

如果a=b返回true,我是否必须重写Object.Equals()方法?或者,在不覆盖Equals方法的情况下,还有其他方法可以做到这一点吗?

EDIT

我想比较数据,因为我想知道我调用的外部方法是否返回一个新对象或一个与新对象不同的数据对象。

提问于
用户回答回答于

有几种方法可以做到这一点。默认情况下,Equals()==检查是否有参考平等,意思是:

Person a = new Person();
Person b = a:

a.Equals(b); //true
a == b; //true

因此,不会将对象与值相等进行比较,这意味着:

Person a = new Person { id = 1, name = "person1" };
Person b = new Person { id = 1, name = "person1" };

a.Equals(b); //false
a == b; //false

要比较对象的值,可以覆盖Equals()GetHashcode()方法,如下所示:

public override bool Equals(System.Object obj)
{
    if (obj == null)
        return false;

    Person p = obj as Person;
    if ((System.Object)p == null)
        return false;

    return (id == p.id) && (name == p.name);
}

public bool Equals(Person p)
{
    if ((object)p == null)
        return false;

    return (id == p.id) && (name == p.name);
}

public override int GetHashCode()
{
    return id.GetHashCode() ^ name.GetHashCode();
}

现在,您将在比较时看到其他结果:

Person a = new Person { id = 1, name = "person1" };
Person b = new Person { id = 1, name = "person1" };
Person c = a;

a == b; //false
a == c; //true
a.Equals(b); //true
a.Equals(c); //true

==运营商不被覆盖,因此仍然没有参考比较。这可以通过重载它以及!=运算符来解决:

public static bool operator ==(Person a, Person b)
{
    if (System.Object.ReferenceEquals(a, b))
        return true;

    if ((object)a == null || (object)b == null)
        return false;

    return a.id == b.id && a.name == b.name;
}

public static bool operator !=(Person a, Person b)
{
    return !(a == b);
}

现在运行检查结果如下:

Person a = new Person { id = 1, name = "person1" };
Person b = new Person { id = 1, name = "person1" };
Person c = a;

a == b; //true
a == c; //true
a.Equals(b); //true
a.Equals(c); //true

更多阅读:

用户回答回答于

您想要重载==运算符。因此,您还应该Equals先覆盖。如果你覆盖Equals你应该总是覆盖GetHashCode。如果您重载==操作员,您还必须重载!=操作员:

public class Person
{
    public int id {get;set;}
    public string name {get;set;}

    public override bool Equals(object obj)
    {
        Person p2 = obj as Person;
        if (object.ReferenceEquals(null, p2)) return false;
        return id == p2.id;
    }

    public static bool operator ==(Person p1, Person p2)
    {
        if (object.ReferenceEquals(null, p1))
            return object.ReferenceEquals(null, p2);
        else if (object.ReferenceEquals(null, p2))
            return false;
        return p1.Equals(p2);
    }

    public static bool operator !=(Person p1, Person p2)
    {
        if (object.ReferenceEquals(null, p1))
            return !object.ReferenceEquals(null, p2);
        else if (object.ReferenceEquals(null, p2))
            return true;
        return !p1.Equals(p2);
    }

    public override int  GetHashCode()
    {
        return id ;
    }
}

现在,这将比较值(the id)而不是仅引用:

Person p1 = new Person { id = 1, name = "Jeff" };
Person p2 = new Person { id = 2, name = "Tim" };
bool equalPersons = p1 == p2; // false
Person p3 = new Person { id = 1, name = "Jeff 2.0" }; // same id -> equal
equalPersons = p1 == p3; // true

MSDN:实现等于和平等运算符的指南(==)

所属标签

可能回答问题的人

  • Hanzo

    2 粉丝0 提问5 回答
  • Richel

    9 粉丝0 提问4 回答
  • software

    10 粉丝488 提问3 回答
  • 不吃貓的鱼oo

    6 粉丝466 提问2 回答

扫码关注云+社区

领取腾讯云代金券