Подтвердить что ты не робот

Когда переопределить GetHashCode()?

Когда мы должны переопределить метод GetHashCode(), предоставляемый классом Object "в пространстве имен Система?

4b9b3361

Ответ 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