GetHashCode (), основанный на первичном ключе - это безопасно?

2

класс имеет свойство ID, и это свойство получает значение из столбца первичного ключа таблицы SQL.

Это хорошая практика, если я пишу

public override int GetHashCode()
{
    return this.ID + GetType().GetHashCode();
}

в мой класс? (Равенство переопределено уже таким же образом.)

Теги:
hash

2 ответа

5
Лучший ответ

Почему вы особенно хотите включить тип в хэш-код? Я вижу, как это могло бы быть полезно, если бы у вас было много разных типов объектов с одним и тем же идентификатором на одной карте, но обычно я просто использовал

public override int GetHashCode()
{
    return ID; // If ID is an int
    // return ID.GetHashCode(); // otherwise
}

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

public override bool Equals(object obj)
{
    MyType other = obj as other;
    return other != null && other.ID == ID;
}

(Возможно, вам захочется иметь строго типизированный метод Equals и реализовать IEquatable.)

  • 0
    Спасибо вам обоим, +1 за запечатанную идею.
2

Почему вы не можете просто сделать

public override int GetHashCode() {
    return this.ID.GetHashCode();
}

Я не уверен, что то, что вы делаете, является хорошей практикой, потому что я не знаком с тем, как хэш-код присваивается экземпляру типа. И цель хэш-кода состоит в том, чтобы иметь представление консистенции объекта в форме Int32.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню