私はクラスを持っています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);
しかし、私はプログラマーです!実際object
にPerson
!
私は何が欠けていますか?ここでの利点を理解するのに苦労していますEqualityComparer<Object>.Default
。誰かが私が間違っていることを証明するための例を教えてもらえますか?