首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检查对象是否等于同一类的新对象?

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

Stack Overflow用户
提问于 2013-12-20 18:28:13
回答 6查看 27.6K关注 0票数 14

如果我有一个这样的对象:

代码语言:javascript
复制
public class Person
{
    public int id {get;set;}
    public string name {get;set;}
}

我想要的是行为:

代码语言:javascript
复制
Person a = new Person();
Person b = new Person();

a == b;

并且a == b返回true,我必须重写Object.Equals()方法吗?或者,是否有其他方法可以在不重写Equals方法的情况下完成此操作?

编辑

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

EN

回答 6

Stack Overflow用户

发布于 2013-12-20 18:34:59

您希望重载==操作符。因此,您还应该首先覆盖Equals。如果您覆盖Equals,则应该始终覆盖GetHashCode。如果重载==操作符,还必须重载!=操作符:

代码语言:javascript
复制
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 ;
    }
}

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

代码语言:javascript
复制
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: Guidelines for Implementing Equals and the Equality Operator (==)

票数 2
EN

Stack Overflow用户

发布于 2020-10-02 18:58:41

在C# 9.0及更高版本中,有一个名为record的新类型,它的相等性是基于值的。所以你可以这样定义它:

代码语言:javascript
复制
public record Person
{
    public string LastName { get; }
    public string FirstName { get; }

    public Person(string first, string last) => (FirstName, LastName) = (first, last);
}

然后你就可以使用

代码语言:javascript
复制
var bill1 = new Person("Bill", "Wagner");
var bill2 = new Person("Bill", "Wagner");

Console.WriteLine(bill1 == bill2); // true

参考:https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9#record-types

票数 1
EN

Stack Overflow用户

发布于 2013-12-20 18:29:17

代码语言:javascript
复制
object.Equals(object2);

在您的案例中:

代码语言:javascript
复制
a.Equals(b);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20701507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档