GetHashCode()返回一個Int32(不是MD5)。
如果您使用所有相同的屬性值創建兩個對象,那麼如果使用基本或系統GetHashCode(),它們將不會具有相同的散列。
字符串是一個對象和一個異常。
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。
我用它來同步客戶端與服務器。您可以使用所有屬性,也可以使用任何Property更改VerID。這裏的優點是更簡單快速的GetHashCode()。在我的情況下,我已經重置了任何Property更改VerID。
我結束了使用的ObjID孤單,所以我可以做相同的屬性值以下
if (myClientObj == myServerObj && myClientObj.VerID <> myServerObj.VerID)
{
// need to synch
}
Object.GetHashCode Method
兩個對象。他們是平等的嗎?他們是否產生相同的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();
}
}
會話之間存儲哈希值嗎? –
有關如何序列化反序列化這些對象的更多信息。你是否覆蓋GetHashCode()? – Paparazzi