5

私はクラスを持っていますPerson、それはからEquals()メソッドを実装しIEquatable<Person>ます(これもメソッドをオーバーライドしますObject.Equals、今のところGetHashcode()メソッドを無視しましょう)

class Person : IEquatable<Person>
{
    public string Name { get; set; }

    public bool Equals(Person other)
    {
        return this.Name == other.Name;
    }
    public override bool Equals(object obj)
    {
        var person = obj as Person;
        return person != null && person.Name == Name;
    }
}

じゃあ始めよう:

Person p1 = new Person() { Name = "a" };
Person p2 = new Person() { Name = "a" };

List<Person> lst1 = new List<Person>() { p1 };
List<Person> lst2 = new List<Person>() { p2 };

この行について話しましょう:

 bool b = lst1.SequenceEqual(lst2, EqualityComparer<Person>.Default);

この部分を理解するのに問題があります:

EqualityComparer<Person>.Default

EqualityComparer<Person>.Defaultクラスが実装されているかどうかをチェックすると聞きましたIEquatable-それはEquals(Person other)メソッドを取り、ではありませんEquals(object obj)ボクシングを回避できるという利点があります

ここに画像の説明を入力してください しかし

ありまたはなしでEquals(Person other)実行されます (IEquatableを実装しているため) EqualityComparer<Person>.Default

では、私たちはどのボクシングについて話しているのでしょうか?ありません!

Equals(object obj)実行されるのは次の場合のみ です。

bool b = lst1.SequenceEqual(lst2,EqualityComparer<Object>.Default);

しかし、私はプログラマーです!実際objectPerson

私は何が欠けていますか?ここでの利点を理解するのに苦労していますEqualityComparer<Object>.Default。誰かが私が間違っていることを証明するための例を教えてもらえますか?

4

3 に答える 3

1

2番目のパラメーターとして渡す場合null、または2番目の引数をまったく渡さない場合(これは基本的に同じです)、SequenceEqualsの実装はEqualityComparer<T>.Defaultそれ自体を呼び出します(これを確認するには逆コンパイルEnumerableします)。それはあなたが提供するかどうかにかかわらずあなたが違いを見ない理由を説明しますEqualityComparer<T>.Default

したがって、最終的に2番目のパラメーターは、。以外 EqualityComparer<T>.Defaultの等式比較子を使用する場合にのみ意味があります。

于 2012-03-11T11:34:39.620 に答える
1

渡すことができるのは、 .NET4で追加された一般的な共変性IEqualityComparer<object>.Defaultの効果です。

基本的に、は必要なIEqualityComparer<BaseType>ときにいつでも使用できます。から派生しているので、これは、が必要な場所ならどこでも使用できることを意味します。IEqualityComparer<DerivedType>DerivedType : BaseTypePersonObjectIEqualityComparer<Object>IEqualityComparer<Person>

于 2012-03-11T11:40:09.230 に答える
0

答えはここにあります:http://msdn.microsoft.com/en-us/library/ms131187 (v = vs.110).aspx

値型の場合、パフォーマンスを向上させるために、常にIEquatableを実装し、Object.Equals(Object)をオーバーライドする必要があります。Object.Equalsボックスの値型であり、リフレクションに依存して2つの値が等しいかどうかを比較します。Equalsの実装とObject.Equalsのオーバーライドの両方で、一貫した結果が返されるはずです。

EqualsとGetHashCodeをオーバーライドしない場合、EqualityComparer.Defaultが実際にそれを処理します。

于 2014-09-25T00:13:47.120 に答える