C# Language Sobrecarga de operadores de igualdad.


Ejemplo

Sobrecargar solo a los operadores de igualdad no es suficiente. Bajo diferentes circunstancias, todo lo siguiente puede ser llamado:

  1. object.Equals and object.GetHashCode
  2. IEquatable<T>.Equals (opcional, permite evitar el boxeo)
  3. operator == y operator != (opcional, permite usar operadores)

Cuando se reemplaza Equals , GetHashCode también debe ser overriden. Cuando se implementa Equals , hay muchos casos especiales: comparando con objetos de un tipo diferente, comparándose con uno mismo, etc.

Cuando NO se reemplaza, el método de Equals y el operador == comportan de manera diferente para las clases y estructuras. Para las clases, solo se comparan las referencias, y para las estructuras, los valores de las propiedades se comparan a través de la reflexión, lo que puede afectar negativamente el rendimiento. == no se puede usar para comparar estructuras a menos que esté anulado.

Generalmente la operación de igualdad debe obedecer las siguientes reglas:

  • No debe lanzar excepciones .
  • Reflexividad: A siempre es igual a A (puede no ser cierto para valores NULL en algunos sistemas).
  • Transitvity: si A es igual a B , y B es igual a C , entonces A es igual a C
  • Si A es igual a B , entonces A y B tienen códigos hash iguales.
  • Independencia del árbol de herencia: si B y C son instancias de Class2 heredadas de Class1 : Class1.Equals(A,B) siempre deben devolver el mismo valor que la llamada a Class2.Equals(A,B) .
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);
    }
}