У меня есть класс 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)
будет работать с или без EqualityComparer<Person>.Default
(потому что он реализует IEquatable)
Так о каком боксе мы говорим? нет!
Единственный раз, когда Equals(object obj)
будет запущен, это когда:
bool b = lst1.SequenceEqual(lst2,EqualityComparer<Object>.Default);
Но Я программист! Я никогда не отправлю object
, когда это на самом деле Person
!
Что мне не хватает? У меня проблемы с пониманием выгоды от EqualityComparer<Object>.Default
. Может кто-нибудь дать мне пример, чтобы доказать, что я не прав?