c# - производительность - Почему я должен*не*переопределять GetHashCode()?
keyvaluepair c# (2)
Мой поиск помощника для правильного комбинирования составных хэш-кодов для GetHashCode()
казалось, вызвал некоторую враждебность. У меня сложилось впечатление, что некоторые разработчики C # не думают, что вам следует переопределять GetHashCode()
часто - конечно, некоторые комментаторы, похоже, думали, что библиотека, помогающая получить правильное поведение, будет бесполезной. Такая функциональность считалась достаточно полезной в Java для сообщества Java, чтобы попросить ее добавить в JDK , и теперь она находится в JDK 7 .
Есть ли какая-то фундаментальная причина в том, что в C # вам не нужно - или, определенно, не - переопределять GetHashCode()
(и, соответственно, Equals()
) так часто, как в Java? Я часто это делаю с Java, например, всякий раз, когда я создаю тип, который, как я знаю, я хочу хранить в HashSet
или использовать в качестве ключа в HashMap
(эквивалентно, .net Dictionary
).
Если ваш объект представляет значение или тип, тогда вы ДОЛЖНЫ переопределить GetHashCode () вместе с Equals. Я никогда не переопределяю хэш-коды для классов управления, например «Приложение». Хотя я не вижу причин, почему даже переопределение GetHashCode () в этих обстоятельствах было бы проблемой, поскольку они никогда не будут помешаны индексированию или сопоставлению коллекции.
Пример:
public class ePoint : eViewModel, IEquatable<ePoint>
{
public double X;
public double Y;
// Methods
#region IEquatable Overrides
public override bool Equals(object obj)
{
if (Object.ReferenceEquals(obj, null)) { return false; }
if (Object.ReferenceEquals(this, obj)) { return true; }
if (!(obj is ePoint)) { return false; }
return Equals((ePoint)obj);
}
public bool Equals(ePoint other)
{
return X == other.X && Y == other.Y;
}
public override int GetHashCode()
{
return (int)Math.Pow(X,Y);
}
#endregion
Я написал вспомогательный класс для реализации GetHashCode()
, Equals()
и CompareTo()
используя семантику значения из массива свойств.