Прежде всего, вы уверены, что хотите переопределить Equals()
и GetHashCode()
? В большинстве сценариев вы должны быть в порядке с ссылочным равенством по умолчанию.
Но, допустим, нет. Чем, какова соответствующая семантика равенства, которую вы хотите?
Например, предположим, что каждый A
имеет поле getB
типа B
, и каждый B
имеет поле getA
типа A
. Пусть a1
и a2
- два объекта A
, имеют одинаковые поля и одинаковые getB
(такие же, как в «том же адресе памяти») b1
. Являются ли a1
и a2
равными? Предположим, что b1.getA
совпадает с a1
(то же, что и в «том же адресе памяти»), но не совпадает с a2
. Вы все еще хотите считать a1
и a2
равными?
Если нет, не переопределяйте что-либо и не используйте ссылочное равенство по умолчанию.
Если да, то вот решение: пусть A
имеет функцию int GetCoreHashCode()
, которая не зависит от элемента getB
(но зависит от других полей). Пусть функция B
имеет функцию int GetCoreHashCode()
, которая не зависит от элемента getA (но зависит от других полей). Пусть теперь функция int GetHashCode()
A
зависит от this.GetCoreHashCode()
и getB.GetCoreHashCode()
, а также для B
, и вы закончили.