GetHashCode() 返回一个 Int32(不是 MD5)。
如果您使用基本或系统 GetHashCode() 创建两个具有所有相同属性值的对象,它们将不会具有相同的 Hash。
String 是一个对象,也是一个例外。
string s1 = "john";
string s2 = "john";
if (s1 == s2) returns true and will return the same GetHashCode()
如果要控制两个对象的相等比较,则应覆盖 GetHash 和 Equality。
如果两个对象相同,那么它们也必须具有相同的 GetHash()。但是具有相同 GetHash() 的两个对象不一定相同。比较将首先测试 GetHash(),如果它在那里匹配,它将测试 Equals。好的,有一些比较直接进入 Equals,但您仍然应该覆盖两者并确保两个相同的对象产生相同的 GetHash。
我用它来同步客户端和服务器。您可以使用所有属性,也可以让任何属性更改更改 VerID。这里的优点是更简单更快的 GetHashCode()。在我的情况下,我已经使用任何属性更改来重置 VerID。
public override bool Equals(Object obj)
{
//Check for null and compare run-time types.
if (obj == null || !(obj is FTSdocWord)) return false;
FTSdocWord item = (FTSdocWord)obj;
return (OjbID == item.ObjID && VerID == item.VerID);
}
public override int GetHashCode()
{
return ObjID ^ VerID;
}
我最终只使用 ObjID,所以我可以执行以下操作
if (myClientObj == myServerObj && myClientObj.VerID <> myServerObj.VerID)
{
// need to synch
}
Object.GetHashCode 方法
具有相同属性值的两个对象。他们平等吗?它们产生相同的 GetHashCode() 吗?
personDefault pd1 = new personDefault("John");
personDefault pd2 = new personDefault("John");
System.Diagnostics.Debug.WriteLine(po1.GetHashCode().ToString());
System.Diagnostics.Debug.WriteLine(po2.GetHashCode().ToString());
// different GetHashCode
if (pd1.Equals(pd2)) // returns false
{
System.Diagnostics.Debug.WriteLine("pd1 == pd2");
}
List<personDefault> personsDefault = new List<personDefault>();
personsDefault.Add(pd1);
if (personsDefault.Contains(pd2)) // returns false
{
System.Diagnostics.Debug.WriteLine("Contains(pd2)");
}
personOverRide po1 = new personOverRide("John");
personOverRide po2 = new personOverRide("John");
System.Diagnostics.Debug.WriteLine(po1.GetHashCode().ToString());
System.Diagnostics.Debug.WriteLine(po2.GetHashCode().ToString());
// same hash
if (po1.Equals(po2)) // returns true
{
System.Diagnostics.Debug.WriteLine("po1 == po2");
}
List<personOverRide> personsOverRide = new List<personOverRide>();
personsOverRide.Add(po1);
if (personsOverRide.Contains(po2)) // returns true
{
System.Diagnostics.Debug.WriteLine("Contains(p02)");
}
}
public class personDefault
{
public string Name { get; private set; }
public personDefault(string name) { Name = name; }
}
public class personOverRide: Object
{
public string Name { get; private set; }
public personOverRide(string name) { Name = name; }
public override bool Equals(Object obj)
{
//Check for null and compare run-time types.
if (obj == null || !(obj is personOverRide)) return false;
personOverRide item = (personOverRide)obj;
return (Name == item.Name);
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
}