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

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

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

如果我有这样的对象:

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

更多阅读:

热门问答

请问bugly上报的服务器是在哪?如果要发行海外版本,能把上报服务器调成海外吗?

扩展能力之云调用,小程序端出错:[tcb-js-sdk]参数错误:非法的应用标识?

software微软、谷歌、腾讯、阿里、百度……
推荐
您好,appSign必须是小程序的appid,appSecret的两个字段必须是在云开发控制台-安全来源里配置过的。 image.png ... 展开详请

serverless db 如何管理?

Richel码农
推荐
1.支持pg_dump,psql工具进行数据导入和导出。 2.本地CLI,可以使用postgresql的客户端psql,也可以使用dbeavr,navicate,pgadmin等工具访问。 3.支持操作DB ,要自己写逻辑 ... 展开详请

游戏联机对战引擎实时服务器怎么请求外部接口?

您好,实时服务器支持http访问内网,需要在实时服务器内下载request模块,同时把node_modules文件夹压缩打包上传发布实时服务器。

对象存储, 版本控制,没有提供对象的历史版本列表的查询API吗?

安卓APP使用免费版加固后,在Android11系统上运行闪退,是什么原因?

hello,目前已经适配了Android R Beta1,预计这周内上线移动应用安全在线版,请留意日志更新

所属标签

扫码关注云+社区

领取腾讯云代金券