Когда мы должны переопределить метод GetHashCode(), предоставляемый классом Object "в пространстве имен Система?
Когда переопределить GetHashCode()?
Ответ 1
Когда вы переопределяете Equals
, в основном. Если вы хотите представить другое представление о равенстве, чем простое ссылочное равенство.
Строка - хороший пример этого - две строки равны (при простом вызове Equals), если они представляют одну и ту же последовательность символов. Хеш-код отражает это, так что, если две строки равны, они будут иметь один и тот же хэш-код. (Обратное не обязательно верно - две неравные строки могут иметь один и тот же хэш-код, но это маловероятно.)
(Строки сложны другими способами, заметьте - существует множество разных идей равенства, основанных на культуре и корпусе, но String.Equals
просто смотрит на кодовые точки UTF-16, составляющие строку, и сравнивает их самым простым способом.)
Ответ 2
Если ваш тип должен следовать семантике значений (сравнение содержимого) вместо ссылочной семантики (сравнивая идентификатор объекта), вы должны написать собственное переопределение экземпляра объекта .Equals().
Ответ 3
Если вы переопределяете Equals
, вы также должны переопределить GetHashCode
.
Ответ 4
"Метод GetHashCode может быть переопределен производным типом. Типы значений должны переопределять этот метод, чтобы предоставить хеш-функцию, подходящую для этого типа, и предоставить полезное распределение в хеш-таблице. Для получения наилучших результатов хеш-код должен основываться на значении поля или свойства экземпляра вместо статического поля или свойства.
Объекты, используемые в качестве ключа в объекте Hashtable, также должны переопределять метод GetHashCode, поскольку эти объекты должны генерировать собственный хэш-код. Если объект, используемый в качестве ключа, не обеспечивает полезную реализацию GetHashCode, вы можете указать поставщика хеш-кода при создании объекта Hashtable. До версии .NET Framework версии 2.0 поставщик хеш-кода был основан на интерфейсе System.Collections..::. IHashCodeProvider. Начиная с версии 2.0, поставщик хеш-кода основан на интерфейсе System.Collections..::. IEqualityComparer. "
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx