6

Entity Framework 5 を使用しています。私の C# コードでは、2 つのオブジェクトが等しいかどうかを比較したいと考えています。そうでない場合は、更新を発行したいと思います。

.Equals メソッドと gethascode メソッドをオーバーライドする必要があると言われました。私のクラスは次のようになります。

public class Students    {
    public int PersonId { get; set; }
    public string Name { get; set; }
    public int Age {get; set;} 
}

.Equals と .GetHashCode をオーバーライドする必要がある理由を説明できる人もいます。また、誰かが私に例を挙げてもらえますか。特に、ハッシュコードについてはよくわかりません。私の PersonId は、このクラスの一意の番号であることに注意してください。

4

2 に答える 2

3

さまざまな理由から、2 つのメソッドをオーバーライドする必要があります。は、たとえばおよびGetHashCodeでの挿入と検索に使用されます。このメソッドは、オブジェクトの等価性テストに使用されます。例えば:DictionaryHashTableEquals

public partial class myClass
{
  public override bool Equals(object obj)
  {
     return base.Equals(obj);
  }

  public override int GetHashCode()
  {
     return base.GetHashCode();
  }
}

の場合GetHashCode、次のようにします。

  public int GetHashCode()
  {
     return PersonId.GetHashCode() ^ 
            Name.GetHashCode() ^ 
            Age.GetHashCode();
  }

メソッドをオーバーライドする場合GetHashCodeは、 もオーバーライドする必要がありますEquals。逆も同様です。2 つのオブジェクトが等しいかどうかをテストするときにオーバーライドされたEqualsメソッドが返される場合、オーバーライドされたメソッドは 2 つのオブジェクトに対して同じ値を返す必要があります。trueGetHashCode

于 2013-08-11T04:44:11.920 に答える
1

クラスは参照型です。2 つのオブジェクトを作成して変数に保存すると、それらへの参照のみが保存されます。つまり、それらを比較しようとすると、ヒープ上の同じオブジェクトを指している場合にのみ等しい2つの参照のみを比較することになります。その動作を変更したい場合は、オーバーライドする必要がありますEquals。また、一部のコレクションは、特定のクラスの 2 つのオブジェクトを比較する何らかの手段を必要とするツリー状 (またはその他の) 構造に要素を格納
することに依存しています。GetHashCode定義したクラスが特定の状況下で正しく動作する必要がある場合は、これらのメソッドを実装する必要があるのはそのためです。
の典型的な実装GetHashCode@No Idea For Name の回答で指定されたクラスのフィールドの xor になります。ただし、この例では PersonId が一意であるため、次のように使用することもできます。

public int GetHashCode()
{
   return PersonId.GetHashCode();
}
于 2013-08-11T04:45:14.767 に答える