Для ссылочных типов как использование IEquatable<T> уменьшает использование приведения?

Я прочитал в нескольких статьях, которые

для ссылочных типов использование IEquatable сокращает использование приведения

Может ли кто-нибудь любезно привести убедительный пример.

3 ответа

Просто чтобы добавить простой пример после объяснения Дарио:

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, Для правильной реализации проверьте документы:

Если вы реализуете IEquatable <(Of <(T>)>), вам также следует переопределить реализации базового класса Object..::.Equals(Object) и GetHashCode, чтобы их поведение соответствовало поведению IEquatable<(Of <(T>)>)..::. Метод Equals

Вы знаете эту статью? Это говорит

Если вы хотите иметь собственную реализацию, вы можете переопределить этот метод. Поскольку метод Equals имеет параметр типа Object, потребуется преобразование, чтобы иметь возможность доступа к членам класса.

Вот тут-то и появляется интерфейс IEquatable. IEquatable - это новый универсальный интерфейс в.NET 2.0, который позволяет вам делать то же самое, что и метод System.Object.Equals, но без необходимости выполнять приведения. Таким образом, при реализации этого интерфейса вы можете уменьшить количество приведений, что является хорошим фактором для производительности. Особенно при большой работе с универсальными коллекциями, поскольку универсальные коллекции используют это сравнение на равенство в некоторых своих методах (List.Equals(), List.IndexOf(), List.LastIndexOf(), ...).

Из-за своего общего параметра типа, IEquatable<T> может обеспечить проверку типов во время компиляции, так что вам не нужно приводить и выполнять позднее связывание с objects.

Я считаю, что ваш ответ здесь, http://msdn.microsoft.com/en-us/library/ms131190.aspx. Прочитайте раздел замечаний на странице.

Другие вопросы по тегам