По умолчанию оператор == проверяет равенство ссылок, определяя, указывают ли две ссылки на один и тот же объект, поэтому ссылочные типы не должны реализовывать operator == для получения этой функциональности.Когда тип является неизменяемым, то есть данные, содержащиеся в экземпляре, не могут быть изменены, может быть полезен оператор перегрузки == для сравнения равенства значений вместо ссылочного равенства, поскольку в качестве неизменяемых объектов их можно считать одинаковыми, если они имеюттакое же значение.Переопределение оператора == в неизменяемых типах не рекомендуется.
Equals - это виртуальный метод, позволяющий любому классу переопределить свою реализацию.Любой класс, представляющий значение, по существу, любой тип значения или набор значений в виде группы, такой как класс комплексных чисел, должен переопределять Equals.Если тип реализует IComparable, он должен переопределить Equals.