Let's consider Polygon
class. Check for equality should compare references most of the time, but there are many situations where value equality comes in handy (like when one compares two polygons with Assert.AreEqual
).
My idea is to make value equality somewhat secondary to reference equality. In this case it's pretty obvious that ==operator
should keep its default reference check implementation.
What about object.Equals()
and IEquatable<Polygon>.Equals()
then? MSDN doesn't imply that ==
and .Equals()
should do the same but still - wouldn't it make the behavior of Polygon
objects too ambiguous?
Also, the Polygon
class is mutable.
MSDN is almost clear about it
To check for reference equality, use
ReferenceEquals
. To check for value equality, you should generally useEquals
. However, Equals as it is implemented byObject
just performs a reference identity check. It is therefore important, when you callEquals
, to verify whether the type overrides it to provide value equality semantics. When you create your own types, you should overrideEquals
.
By default, the operator
==
tests for reference equality by determining if two references indicate the same object, so reference types do not need to implement operator == in order to gain this functionality. When a type is immutable, meaning the data contained in the instance cannot be changed, overloading operator == to compare value equality instead of reference equality can be useful because, as immutable objects, they can be considered the same as long as they have the same value. Overriding operator==
in non-immutable types is not recommended.
IEquatable documentation is also very clear
Defines a generalized method that a value type or class implements to create a type-specific method for determining equality of instances.