darktone 最近的时间轴更新
darktone

darktone

V2EX 第 313423 号会员,加入于 2018-05-03 02:41:52 +08:00
darktone 最近回复了
感谢各位的回复。
又写了点测试代码,加上查资料+反汇编,我基本上弄清楚了。
仅从题目来说,特定的 Equals(Pet other)和 Equals(object obj)并非必要,两者有一个即可。

微软之所以在文档示例中两者都显式写明实现,是为了“泛用性”,“一致性”。

用户自己写的代码,当然可以显式指定去调用特定的 Equals(Pet other),但 net framework 中还有许多用户并没有显式指明的部分,此时 net framework 都会默认使用 Equals(object obj),因为它不知道用户有没有实现特定的 Equals(Pet other),自然不能预先假设,但 net 有一点可以确定,哪怕用户没有自定义的 overwrite Equals(object obj),也有基类 object Equals(object obj)可用,不会产生异常。
@charlie21 多谢解答,你的建议是单独弄一个方法,而不是去重载 Equlas ?但是这里有一个问题,传进来的 object 不能保证具有 name 和 age 属性啊,如果用类型判断 GetType 或者 obj as Pet,直接就 return false 了,根本不会执行 return pet.name == obj.name && pet.age == obj.age
@cmdOptionKana 是不是说,重写 Equals(object obj)目的是为了更好的兼容性? 但是我喂一个不是 pet 的东西,比如 Gdd,就算调用了 Equals(object obj)执行到 Pet p = obj as Pet;
if ((Object)p == null)
{
return false;
这里就返回 false 了,也不会去执行 return this.Name == p.Name && this.Age == p.Age;
Equals(object obj)中这样写有啥意义呢?
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5988 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 19ms · UTC 06:30 · PVG 14:30 · LAX 22:30 · JFK 01:30
Developed with CodeLauncher
♥ Do have faith in what you're doing.