GetHashCode()はInt32(MD5ではなく)を返します。
同じプロパティ値を持つ2つのオブジェクトを作成した場合、ベースまたはシステムのGetHashCode()を使用する場合、同じハッシュはありません。
文字列はオブジェクトであり例外です。
string s1 = "john";
string s2 = "john";
if (s1 == s2) returns true and will return the same GetHashCode()
2つのオブジェクトの等価比較を制御する場合は、GetHashとEqualityをオーバーライドする必要があります。
2つのオブジェクトが同じ場合、それらは同じGetHash()も持つ必要があります。しかし、同じGetHash()を持つ2つのオブジェクトは必ずしも同じではありません。比較はまずGetHash()をテストし、そこに一致するものがあればEqualsをテストします。 OKはいくつかの比較がEqualsにまっすぐ行くが、あなたはまだ両方をオーバーライドし、2つの同一のオブジェクトが同じGetHashを生成していることを確認する必要があります。
私はこれを使用してクライアントをサーバーと同期させます。すべてのプロパティを使用することもできますし、プロパティの変更によりVerIDを変更することもできます。ここでの利点は、より簡単なGetHashCode()です。私の場合は、すでにプロパティの変更を行ってVerIDをリセットしていました。
私は同じプロパティ値を次のよう
if (myClientObj == myServerObj && myClientObj.VerID <> myServerObj.VerID)
{
// need to synch
}
Object.GetHashCode Method
2つのオブジェクトを行うことができますので、私は一人のObjID使用して終了。彼らは等しいのですか?彼らは同じ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