Почему GetHashCode не является свойством, подобным HashCode в .NET

StackOverflow https://stackoverflow.com/questions/538708

  •  22-08-2019
  •  | 
  •  

Вопрос

Почему GetHashCode не является свойством, подобным HashCode в .NET?

Это было полезно?

Решение

Я не думаю, что есть какая-то веская причина.Любая реализация GetHashCode должно быть достаточно быстро, чтобы разместить его в собственности.Тем не менее, есть много конструктивных недостатков в рамках .Net некоторые небольшие, некоторые серьезные.Это кажется небольшим.

Другие советы

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

Редактировать:Рекомендации по этому поводу: Свойства и методы

«Операция достаточно дорогая, и вы хотите сообщить пользователю, что ему следует рассмотреть возможность кэширования результата».

Возможно, в некоторых случаях GetHashCode обходится достаточно дорого.

Часто невозможно определить HashCode для класса, который делает:

напримеробъекты класса не иметь четко определенную концепцию идентичность.

Поэтому метод GetHashCode() обычно вызывает исключение NotImplementedException.Это вызвало бы массу проблем, если бы HashCode был свойством, поскольку большинство людей (и отладчиков) предполагают, что всегда допустимо получить значение свойства.

Помимо того, что свойство — это не что иное, как методы получения и установки, с точки зрения проектирования свойство никогда не должно содержать никаких вычислений, кроме инициализации или проверки, например:

private object _obj;
public object Obj
{
  get
  {
    if(_obj == null)
    {
      _obj = new object();
    }
    return _obj;
  }
  set
  {
    if(value == badvalue)
    {
      throw new ArgumentException("value");
    }
    _obj = value;
  }
}

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

свойства следует использовать только в том случае, если вычисления, стоящие за ними, действительно быстрые или кэшируются.

кроме того, в большинстве случаев единственной логикой в ​​свойствах должна быть проверка

Вы должны помнить, что .NET Framework спроектирован так, чтобы к нему можно было получить доступ на самых разных языках.

Теоретически вы можете создать компилятор, который не сможет правильно переопределять свойства.Хотя это и сделало бы компилятор довольно дрянным, это не обязательно было бы незаконным.(Помните, что свойства — это просто методы с некоторыми метаданными)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top