Люди, вот тернистая проблема для Вас!
Часть системы TickZoom должна собрать экземпляры каждого типа объекта в Словарь <> тип.
Обязательно, что их равенство и хэш-код быть основанными на экземпляре объекта, что означает ссылочное равенство вместо равенства значения. Проблема состоит в том, что некоторые объекты в системе переопределили, Равняется () и GetHashCode () для использования в качестве равенства значения, и их внутренние значения будут изменяться со временем. Это означает, что их Равняется, и GetHashCode бесполезны. Как решить это в общем, а не навязчиво?
До сих пор Мы создали структуру для обертывания каждого объекта под названием ObjectHandle для хеширования в Словарь. Как Вы видите ниже, мы реализовали, Равняется (), но проблема того, как вычислить хэш-код, остается.
public struct ObjectHandle : IEquatable<ObjectHandle>{
public object Object;
public bool Equals(ObjectHandle other) {
return object.ReferenceEquals(this.Object,other.Object);
}
}
Видеть? Существует объект метода. ReferenceEquals (), который сравнит ссылочное равенство не принимая во внимание любого переопределенного, Равняется () реализации в объекте.
Теперь, как вычислить соответствие GetHashCode (), только считая ссылку без беспокойства о каком-либо переопределенном GetHashCode () методом?
Ahh, я надеюсь, что это дает Вам интересную загадку. Мы застреваем здесь.
С уважением, Wayne
RuntimeHelpers.GetHashCode () делает именно то, что здесь необходимо.
Вы нарушаете шаблон, это приводит к вопросам, которые невозможно решить. Метод Equals
должен сравнивать содержимое объектов вместо сравнения ссылок. Это то, что делает object.Equals
, зачем переопределять с таким же поведением?
Теперь о GetHashCode
. Опять же, хэш-код - это хеш-функция, применяемая к содержимому объекта. Вы не можете рассчитать это только по ссылке. Вы можете использовать указатель на объект и использовать его как хэш, но в .net адреса объектов могут быть изменены сборщиком мусора.
Хэш-код не обязательно должен быть уникальным. (Но уникальность улучшит производительность).
Итак - одна вещь, которую вы можете сделать, - это установить хэш-код по имени типа.
Все объекты одного типа будут иметь одинаковый хэш-код.