Переопределение GetHashCode
Как вы знаете, GetHashCode возвращает полу-уникальное значение, которое можно использовать для идентификации экземпляра объекта в коллекции. В качестве хорошей практики рекомендуется переопределить этот метод и реализовать свои собственные.
Мой вопрос: вы переопределяете этот метод при работе над пользовательскими объектами? Если да, то какой алгоритм вы используете для создания уникального идентификатора?
Я думал о создании GUID, а затем получал целые данные от этого идентификатора.
Ответы
Ответ 1
При переопределении GetHashCode()
вам также необходимо переопределить Equals()
, operator==
и operator!=
. И будьте очень осторожны, чтобы удовлетворить все требования к этим методам.
Руководства здесь, в MSDN. Самая важная цитата:
Не рекомендуется переопределять оператор == в неизменяемых типах.
Ответ 2
Если вы используете resharper, он может генерировать тела GetHashCode(), Equals и тела оператора.
Откройте это меню, нажав Alt + Insert.
http://www.jetbrains.com/resharper/webhelp/Code_Generation__Equality_Members.html
Ответ 3
В моем личном использовании я переопределяю только при переопределении метода equals. Как правило, я делаю это для объектов, которые, как я знаю, могут запускать запрос LINQ to Objects или другую операцию сравнения.
Я обычно возвращаю, если говорят объект LINQ to SQL или объект DTO, значение первичного ключа. Независимо от того, что вы вернете, если вы не храните значение локально, это может привести к неожиданному результату.
НТН.
Ответ 4
Я бы обычно переопределял методы проверки hashcode и проверки равенства для классов данных (например, классы, где семантика значений имеет смысл). Посмотрите на этот вопрос для общей реализации. Если вы переопределите значение hashcode override. Использование GUID - довольно страшная идея, потому что вы хотите, чтобы два объекта, которые являются разными экземплярами, но имеют одинаковое значение, имеют один и тот же хэш-код и равны для возврата true.
Ответ 5
вам нужно только переопределить GetHashCode, если вы переопределяете Equals. По умолчанию GetHashCode реализуется средой выполнения так же, как вы хотели это сделать - каждый объект имеет скрытое поле, назначенное средой выполнения.
Как переопределить GetHashCode
На самом деле ваша IDE должна сделать это для вас - при вводе "переопределить GetHashCode" среда IDE должна сгенерировать этот шаблонный код. Visual Studio не делает этого, но SharpDevelop делает.
Ответ 6
Обычно я использую агрегированный GetHashCode из свойств компонента этого класса. Например.
public class Test
{
public string Text { get; set; }
public int Age { get; set; }
public override GetHashCode()
{
int result =
string.IsNullOrEmpty(Text) ? 0 : Text.GetHashCode()
+ Age.GetHashCode();
return result;
}
}