c# - производительность - Почему я должен*не*переопределять GetHashCode()?




keyvaluepair c# (2)

Мой поиск помощника для правильного комбинирования составных хэш-кодов для GetHashCode() казалось, вызвал некоторую враждебность. У меня сложилось впечатление, что некоторые разработчики C # не думают, что вам следует переопределять GetHashCode() часто - конечно, некоторые комментаторы, похоже, думали, что библиотека, помогающая получить правильное поведение, будет бесполезной. Такая функциональность считалась достаточно полезной в Java для сообщества Java, чтобы попросить ее добавить в JDK , и теперь она находится в JDK 7 .

Есть ли какая-то фундаментальная причина в том, что в C # вам не нужно - или, определенно, не - переопределять GetHashCode() (и, соответственно, Equals() ) так часто, как в Java? Я часто это делаю с Java, например, всякий раз, когда я создаю тип, который, как я знаю, я хочу хранить в HashSet или использовать в качестве ключа в HashMap (эквивалентно, .net Dictionary ).


Если ваш объект представляет значение или тип, тогда вы ДОЛЖНЫ переопределить GetHashCode () вместе с Equals. Я никогда не переопределяю хэш-коды для классов управления, например «Приложение». Хотя я не вижу причин, почему даже переопределение GetHashCode () в этих обстоятельствах было бы проблемой, поскольку они никогда не будут помешаны индексированию или сопоставлению коллекции.

Пример:

public class ePoint : eViewModel, IEquatable<ePoint>
{
    public double X;

    public double Y;

    // Methods

    #region IEquatable Overrides

    public override bool Equals(object obj)
    {
        if (Object.ReferenceEquals(obj, null)) { return false; }

        if (Object.ReferenceEquals(this, obj)) { return true; }

        if (!(obj is ePoint)) { return false; }

        return Equals((ePoint)obj);
    }

    public bool Equals(ePoint other)
    {
        return X == other.X && Y == other.Y;
    }

    public override int GetHashCode()
    {
        return (int)Math.Pow(X,Y);
    }

    #endregion

Я написал вспомогательный класс для реализации GetHashCode() , Equals() и CompareTo() используя семантику значения из массива свойств.







hash