Я прочитал в нескольких статьях, что
для ссылочных типов, использующих IEquatable, уменьшает использование литья
Может ли кто-нибудь привести убедительный пример.
Просто добавить простой пример после объяснения Дарио :
class Person : IEquatable<Person> { public string Name { get; set; } public override bool Equals(object obj) { if (obj is Person) { Person other = (Person)obj; // check equality } return base.Equals(obj); } #region IEquatable<Person> Members public bool Equals(Person other) { // check equality without cast } #endregion }
Примечание: это всего лишь небольшой фрагмент, показывающий, почему это позволяет избежать cast. Для правильной реализации проверьте документы :
cast
Если вы реализуете IEquatable <(Of <(T>)>), вы также должны переопределить реализации базового класса Object .. ::. Equals (Объект) и GetHashCode, чтобы их поведение в соответствии с тем из IEquatable <(Of <(T>)>) .. ::. Равно Метод
Знаете ли вы эту статью ? Это говорит
Если вы хотите иметь собственную реализацию, вы можете переопределить этот метод. Так как метод Equals имеет параметр типа Object, потребуется преобразование, чтобы иметь возможность доступа к членам класса. Именно здесь появляется интерфейс IEquatable. IEquatable - это новый универсальный интерфейс в .NET 2.0, который позволяет вам делать то же самое, что и метод System.Object.Equals, но без выполнения приведения. Таким образом, при реализации этого интерфейса вы можете уменьшить количество приведений, что является хорошим фактором для производительности. Особенно при большой работе с универсальными коллекциями, поскольку универсальные коллекции используют это сравнение на равенство в некоторых своих методах (List.Equals (), List.IndexOf (), List.LastIndexOf (), ...).
Если вы хотите иметь собственную реализацию, вы можете переопределить этот метод. Так как метод Equals имеет параметр типа Object, потребуется преобразование, чтобы иметь возможность доступа к членам класса.
Именно здесь появляется интерфейс IEquatable. IEquatable - это новый универсальный интерфейс в .NET 2.0, который позволяет вам делать то же самое, что и метод System.Object.Equals, но без выполнения приведения. Таким образом, при реализации этого интерфейса вы можете уменьшить количество приведений, что является хорошим фактором для производительности. Особенно при большой работе с универсальными коллекциями, поскольку универсальные коллекции используют это сравнение на равенство в некоторых своих методах (List.Equals (), List.IndexOf (), List.LastIndexOf (), ...).
Благодаря своему параметру универсального типа, IEquatable<T> может обеспечить проверку типов во время компиляции, поэтому вам не нужно приводить и выполнять позднее связывание с object s.
IEquatable<T>
object
Я думаю, что ваш ответ здесь, http://msdn.microsoft.com/en-us/library/ms131190.aspx. Прочтите раздел замечаний на странице.