What decision should I take about Equals(), ReferenceEquals(), and == from the following results? What do they produce actually?
#region
int integer = 1;
int integer2 = integer;
bool referenceEquality = (integer == integer2);//true
bool valueEquality = integer.Equals(integer2);//true
bool valueEqualityMore = object.Equals(integer, integer2);//true
bool valueEqualityMoreMore = object.ReferenceEquals(integer, integer2);//false
#endregion
#region
int integer = 1;
int integer2 = 1;
bool referenceEquality = (integer == integer2);//true
bool valueEquality = integer.Equals(integer2);//true
bool valueEqualityMore = object.Equals(integer, integer2);//true
bool valueEqualityMoreMore = object.ReferenceEquals(integer, integer2);//false
#endregion
#region
MyClass obj = new MyClass(1, "Hello");
MyClass obj2 = obj;
bool referenceEquality = (obj == obj2);//true
bool valueEquality = obj.Equals(obj2);//true
bool valueEqualityMore = object.Equals(obj, obj2);//true
bool valueEqualityMoreMore = object.ReferenceEquals(obj, obj2);//true
#endregion
#region
MyClass obj = new MyClass(1, "Hello");
MyClass obj2 = new MyClass(1, "Hello");
bool referenceEquality = (obj == obj2);//false
bool valueEquality = obj.Equals(obj2);//false
bool valueEqualityMore = object.Equals(obj, obj2);//false
bool valueEqualityMoreMore = object.ReferenceEquals(obj, obj2);//false
#endregion
Hell! I understand nothing.
To me referenceEquals() of the 1st block should return true. == in the second block should return false (as the references are different). And, both of the Equals() in the 4th block should return true (as their values are same).
The first point of confusion you seem to be having is that with value types, i.e. int, float, DateTime, the == operator is value equality. With reference types, == is (by default, see below) reference equality. This would explain the disparity of answers in your first two integer cases.
Secondly, the default implementation of Equals() tests reference equality, not value equality. So since it appears that MyClass doesn't override Equals(), that explains the disparity of answers between your reference cases.
Additionally, many reference types, such as String, override the == operator to provide value-equality semantics. So your best bet, until you memorize which types are which, is to look up the documentation.
In short:
== is value-equality (for framework types)ReferenceEquals() is always reference equality== is reference equality by default, but can be (and often is for framework types) overridden to provide value equalityEquals() is reference equality by default, but can be (and often is for framework types) overridden to provide value equalityIf you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With