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

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

для ссылочных типов, использующих IEquatable, уменьшает использование литья

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

Ответы [ 3 ]

2 голосов
/ 20 мая 2009

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

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 (Объект) и GetHashCode, чтобы их поведение в соответствии с тем из IEquatable <(Of <(T>)>) .. ::. Равно Метод

1 голос
/ 20 мая 2009

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

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

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

Благодаря своему параметру универсального типа, IEquatable<T> может обеспечить проверку типов во время компиляции, поэтому вам не нужно приводить и выполнять позднее связывание с object s.

0 голосов
/ 20 мая 2009

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

...