Если у одного есть два неизменных объекта, которые определяют Equals
для возврата true, когда каждое поле в одном объекте сообщает Equal
соответствующему полю в другом, и если ни один из кода, который использует объекты, не заботится о равенстве ссылок , тогда должна быть возможность заменить все ссылки на один объект ссылками на другой. Если объекты создаются, например, парсинг данных, считанных с диска, и если многие объекты будут сравниваться, замена множества различных экземпляров ссылками на один экземпляр может значительно повысить производительность. Обратите внимание, что правильность такой замены не зависит от того, являются ли объекты мелкими или глубокими неизменяемыми, при условии, что любые изменяемые объекты, вложенные в них, будут сообщать о себе как о неравных чему-либо, кроме самих себя.
Для правильной работы такой логики важно, чтобы рассматриваемые объекты были полностью эквивалентны. Каждый объект должен быть равен самому себе, поэтому Double.NaN
должно равняться Double.NaN
. Требование полной эквивалентности подразумевает, что положительный ноль не должен сообщать о себе равным отрицательному нулю (поскольку, если это так, объект, содержащий положительный ноль, может вести себя иначе, чем объект, содержащий отрицательный ноль).
Обратите внимание, что это область, в которой .net отличается от Java (некоторые неэквивалентные значения с плавающей точкой и Decimal
являются отчетными Equals
); Во многих отношениях я считаю, что .net лучше, но эта деталь - та, в которой .net ошибся.