1

IEquatable に関して非常に単純な質問があります。次の基本クラスがあるとします。

public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public SalaryInformation AnnualSalaryInformation { get; set; }

    }

    public class SalaryInformation
    {
        public string TaxCode { get; set; }
        public string SalaryBand { get; set; }
        public BankInformation AccountInfo { get; set; }
    }

    public class BankInformation
    {
        public string SortCode { get; set; }
        public string AccountNumber { get; set; }
    }

Person オブジェクトと同等かどうかを比較したい場合、どうすればよいでしょうか? Person クラスに IEquatable インターフェイスを実装すると、そのクラス内の任意のオブジェクトに自動的にカスケードされますか?それとも、すべてのクラスにインターフェイスを明示的に実装する必要がありますか?

すべてのクラスにインターフェイスを実装する必要がある場合、Person のインスタンスを Person の別のインスタンスと比較するときに注意すべき特定の「落とし穴」はありますか?

4

3 に答える 3

4

オブジェクト間の平等は、正確に何が必要かによって、さまざまな形をとることができます。あなたの質問に答えるには:

いいえ、単にPersonimplementsがimplementsIEquatableを意味するわけではないからです。との関係はコンポジションであり、コンポジションはインターフェイスの実装を気にしません。SalaryInformationIEquatablePersonSalaryInformation

したがってのEquals実装はPerson、2 人を同一人物と見なす場合によって異なります。

  • 苗字と名前が同じなら同一人物ですか?
  • も同じなら同じSalaryInformationですか?

また、オブジェクトが等しいかどうかを比較できるようにしたい場合は、覚えておくべきガイドラインがいくつかあります。

  1. 等価性は等価関係です。つまり、
    a です。反射、
    b。対称および
    c.推移的。
  2. それnullはどのオブジェクトとも等しくないことに注意してください。
  3. 常にオーバーライドしGetHashCodeます。

コツをつかめば難しくはありませんが、一度もやったことがないと、さまざまな問題が発生する可能性があります。

于 2012-03-05T16:55:03.913 に答える
1

Person2 つのインスタンスが等しい場合は、すべて独自の定義に依存します。ここで行われている魔法はなく、 on の実装IEquatablePerson決してカスケードしません。

では、アプリケーションのコンテキスト内で 2 つの Person インスタンスが等しいと定義するにはどうすればよいでしょうか? 苗字と名字は同じで十分ですか?もしそうなら、それはあなたが実装する方法です。時々使用される他の代替手段は、生成された主キーに基づいて同等性を定義するか、国民保険番号などの一意の値を知っているものです。IEquatable

于 2012-03-05T16:54:58.470 に答える
0

はい、使用しているすべてのクラスにこれを実装します。

しかし、他の人がコメントしたように、それはあなたが達成しようとしていることに少し依存します.

Equals と GetHashCode (両方が必要) を実装する場合は、通常、読み取り専用フィールドのみを比較に含めるようにしてください。これとは別に、GetHashCode が Equals と適切に連携すること (たとえば、Equals が true を返す場合に異なる値を返さないこと) を確認する必要があり、もちろん Equals は対称でなければなりません。

于 2012-03-05T16:55:30.680 に答える