То, какова лучшая стратегия, Равняется и GetHashCode?

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

Это - моя текущая реализация:

public override bool Equals(object obj)
{
    var newObj = obj as MyClass;

    if (null != newObj)
    {
        return this.GetHashCode() == newObj.GetHashCode();
    }
    else
    {
        return base.Equals(obj);
    }
}

// Since this is an entity I can use its Id
// When I don't have an Id, I usually make a composite key of the properties
public override int GetHashCode()
{
    return String.Format("MyClass{0}", this.Id.ToString()).GetHashCode();
}
36
задан Lauren Van Sloun 28 November 2018 в 23:50
поделиться

3 ответа

Предположение, что экземпляры равны, потому что хэш-коды равны, неверно.

Думаю, ваша реализация GetHashCode в порядке, но я обычно использую такие вещи:

public override int GetHashCode() {
    return object1.GetHashCode ^ intValue1 ^ (intValue2 << 16);
}
2
ответ дан 27 November 2019 в 06:07
поделиться

Хэш-коды могут конфликтовать, поэтому я не думаю, что они являются хорошим способом сравнения равенство. Вместо этого вы должны сравнить базовые значения, которые делают объекты «равными». См. Ответ @Jon Skeet на этот вопрос: Какой лучший алгоритм для переопределенного System.Object.GetHashCode? для лучшей реализации GetHashCode, если ваше равенство охватывает несколько свойств. Если это всего лишь одно свойство, вы можете просто повторно использовать его хэш-код.

3
ответ дан 27 November 2019 в 06:07
поделиться

Domain-Driven Design делает различие между Entities и Value Objects. Это хорошее различие, так как оно определяет, как реализовать Equals.

Сущности равны, если их идентификаторы равны друг другу.

Объекты значений равны, если все их (важные) составные элементы равны друг другу.

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

35
ответ дан 27 November 2019 в 06:07
поделиться
Другие вопросы по тегам:

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