【发布时间】:2011-06-20 14:51:58
【问题描述】:
基本上,GethashCode 是不同的,即使它们包含相同的属性值...那么为什么默认返回差异哈希码?
public class User
{
public Int32 Id { get; set; }
public String Username { get; set; }
}
User a = new User();
a.Id = 1;
a.Username = "Hello";
User b = new User();
b.Id = 1;
b.Username = "Hello";
Console.WriteLine("Hash A: {0} | Hash B: {1}", a.GetHashCode(), b.GetHashCode());
//Hash A: 37121646 | Hash B: 45592480 <-- these values change each time I rerun the app?
有没有更合适的方法来做到这一点,这样我就不会破坏 Object.Equals 对我的对象的工作方式,但我仍然能够根据参数值进行自己的相等性检查?
我之所以问是因为我有一个服务:SynchronizeUsers(),它会下载一组用户。而不是清除我的用户缓存,我宁愿只更新需要更新的那些,删除同步所说的那些,然后添加新的。但是,我不能只对这些对象执行 Object.Equals()。
【问题讨论】:
-
应用程序运行时哈希码发生变化是正常的。 不正常的是
a.GetHashCode() != b.GetHashCode()-- 编写该类的人使它有问题,除非该类具有自动初始化为非固定值的重要成员(例如DateTime.Now)。 -
另外,这里的问题是什么? (a) 如何使
Equals返回true,或者(b) 与GetHashCode相关的东西?