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

Переопределение GetHashCode

Как вы знаете, GetHashCode возвращает полу-уникальное значение, которое можно использовать для идентификации экземпляра объекта в коллекции. В качестве хорошей практики рекомендуется переопределить этот метод и реализовать свои собственные.

Мой вопрос: вы переопределяете этот метод при работе над пользовательскими объектами? Если да, то какой алгоритм вы используете для создания уникального идентификатора?

Я думал о создании GUID, а затем получал целые данные от этого идентификатора.

4b9b3361

Ответ 1

При переопределении GetHashCode() вам также необходимо переопределить Equals(), operator== и operator!=. И будьте очень осторожны, чтобы удовлетворить все требования к этим методам.

Руководства здесь, в MSDN. Самая важная цитата:

Не рекомендуется переопределять оператор == в неизменяемых типах.

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