Overloading equality operators

suggest change

Overloading just equality operators is not enough. Under different circumstances, all of the following can be called:

  1. object.Equals and object.GetHashCode
  2. IEquatable<T>.Equals (optional, allows avoiding boxing)
  3. operator == and operator != (optional, allows using operators)

When overriding Equals, GetHashCode must also be overriden. When implementing Equals, there are many special cases: comparing to objects of a different type, comparing to self etc.

When NOT overridden Equals method and == operator behave differently for classes and structs. For classes just references are compared, and for structs values of properties are compared via reflection what can negatively affect performance. == can not be used for comparing structs unless it is overridden.

Generally equality operation must obey the following rules:

class Student : IEquatable<Student>
{
    public string Name { get; set; } = "";
    public bool Equals(Student other)
    {
        if (ReferenceEquals(other, null)) return false;
        if (ReferenceEquals(other, this)) return true;
        return string.Equals(Name, other.Name);
}
    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        return Equals(obj as Student);
    }
    public override int GetHashCode()
    {
        return Name?.GetHashCode() ?? 0;
    }
    public static bool operator ==(Student left, Student right)
    {
        return Equals(left, right);
    }
    public static bool operator !=(Student left, Student right)
    {
        return !Equals(left, right);
    }
}

Feedback about page:

Feedback:
Optional: your email if you want me to get back to you:


Operators:
* Syntax
* Overloading equality operators
* sizeof
* typeof

Table Of Contents
2 Operators
17 Regex
19 Arrays
21 Enum
22 Tuples
24 GUID
27 Looping
36 Casting
46 Methods
88 Events
92 Structs
104 Indexer
106 Stream
107 Timers
109 Threading
127 Caching
135 Pointers
147 C# Script