Создание метода GetHashCode в C#

Если Вы действительно просто возвращаете предопределенное, фиксированное значение, Вы могли бы создать словарь со всеми возможными входными индексами как ключи, наряду с их соответствующими значениями. Кроме того, Вы не могли бы действительно хотеть, чтобы функция сделала это - если Вы не вычисляете возвращаемое значение так или иначе.

, О, и если Вы испытываете желание делать что-то подобное переключателю, см. здесь .

9
задан Rajmond Burgaj 22 July 2018 в 16:50
поделиться

3 ответа

System.Array не переопределяет GetHashCode или Equals , поэтому они используют ссылочное равенство. Поэтому вы не должны их вызывать.

Чтобы реализовать GetHashCode , см. этот вопрос .

Чтобы реализовать Equals , используйте Метод расширения SequenceEqual .

РЕДАКТИРОВАТЬ : В .Net 2.0 вам придется написать свою собственную версию SequenceEqual , например:

public static bool SequenceEquals<T>(IList<T> first, IList<T> second) {
    if (first == second) return true;
    if (first == null || second == null) return false;

    if (first.Count != second.Count) return false;

    for (int i = 0; i < first.Count; i++)
        if (!first[i].Equals(second[i]))
            return false;

    return true;
}

Вы можете написать его, чтобы взять IEnumerable вместо IList , но это '

12
ответ дан 4 December 2019 в 13:49
поделиться

Очень важно убедиться, что вы сохранили переопределение .GetHashCode () в шаге с помощью .Equals ().

По сути, вы должны убедиться, что они рассматривать одни и те же поля, чтобы не нарушать первое из трех правил GetHashCode (из объекта MSDN.GetHashCode () )

Если два объекта сравниваются как равные, GetHashCode для каждого объекта должен возвращать то же значение. Однако, если два объекта не сравниваются как равно, методы GetHashCode для два объекта не должны возвращаться разные значения.

Другими словами, вы должны убедиться, что каждый раз, когда .Equals считает два экземпляра равными, у них также будет один и тот же .GetHashCode ().

Как упоминалось здесь кем-то другим, этот вопрос подробно описывает хорошую реализацию. Если вам интересно, в начале прошлого года я написал в блоге несколько статей об исследовании хэш-кодов. Вы можете найти мои рассуждения здесь (первая запись в блоге, которую я написал по этой теме)

2
ответ дан 4 December 2019 в 13:49
поделиться

Хорошее обсуждение проблем здесь , а самое последнее обновление относится к абстрактному классу BaseObject , предоставленному SharpArchitecture.

Если вам нужно что-то еще ad hoc , я обнаружил, что код, который ReSharper генерирует для Equals () и GetHashCode (), подходит.

1
ответ дан 4 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: