V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  darktone  ›  全部回复第 1 页 / 共 1 页
回复总数  3
感谢各位的回复。
又写了点测试代码,加上查资料+反汇编,我基本上弄清楚了。
仅从题目来说,特定的 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   ·   实用小工具   ·   1042 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 12ms · UTC 22:34 · PVG 06:34 · LAX 14:34 · JFK 17:34
Developed with CodeLauncher
♥ Do have faith in what you're doing.