в документации по VS2005 Guidelines for Overloading Equals() and Operator == (C# Programming Guide) государства в части не рекомендуетсяКогда необходимо переопределить класс .NET Equals()? Когда это не так?
Перекрытие оператор == в не неизменных типов.
В новой документации .NET Framework 4 Guidelines for Implementing Equals and the Equality Operator (==) опускает этот оператор, хотя одно сообщение в Содержимое Сообщества повторяет это утверждение и ссылается на устаревшую документацию.
кажется, что имеет смысл переопределить Equals(), по крайней мере для некоторых тривиальных изменяемых классов, таких как
public class ImaginaryNumber
{
public double RealPart { get; set; }
public double ImaginaryPart { get; set; }
}
В математике, два мнимых чисел, которые имеют ту же самую действительную часть и ту же мнимую часть являются фактически равным в момент времени, когда выполняется равенство. Неверно утверждать, что они не равны, что произойдет, если отдельные объекты с тем же RealPart и ImaginaryPart будут Equals() не переопределены.
С другой стороны, если переопределить Equals(), следует также переопределить GetHashCode(). Если ImaginaryNumber, который переопределяет Equals() и GetHashCode(), помещается в HashSet, а изменяемый экземпляр меняет его значение, этот объект больше не будет найден в HashSet.
Был ли MSDN некорректным, чтобы удалить руководство относительно не переопределения Equals()
и operator==
для неизменяемых типов?
Можно ли переопределить Equals() для изменяемых типов, где эквивалентность всех свойств «в реальном мире» означает, что сами объекты равны (как с ImaginaryNumber
)?
Если разумно, то как лучше всего иметь дело с потенциальной изменчивостью, в то время как экземпляр объекта участвует в HashSet или что-то еще, что полагается на GetHashCode() не меняется?
UPDATE
Просто наткнулся на этот in MSDN
Как правило, вы реализуете равенство значений, когда объекты типа ожидается, будут добавлены к коллекции какой-то, или когда их Основной целью является сохранение набора полей или свойств. Вы можете указать свое определение равенства значений при сравнении всех полей и свойств в типе, или вы можете установить определение в подмножестве . Но в любом случае, и в обоих классах и структурах, ваша реализация должна следовать пяти гарантий эквивалентности:
Я не думаю, что это разумно для 'ImaginaryNumber' быть изменяемый тип. –
В действительности, вы должны, вероятно, реализовать ImaginaryNumber как неизменяемый тип значения (struct). – Joe
Действительно? Зачем? Все остальные номера изменяемы. –