Qual è il modo migliore per garantire che l'implementazione di IEquatable.Equals e l'override di Object.Equals restituiscano lo stesso risultato?

2

Vedi il codice qui sotto:

public virtual bool Equals(Entity other)
        {
            return Equals((Object)other);
        }

public override bool Equals(object obj)
        {
            var compareTo = obj as Entity;
            if (ReferenceEquals(compareTo, null))
                return false;
            if (ReferenceEquals(this, compareTo))
                return true;
            if (GetType() != compareTo.GetType())
                return false;
            if (!IsTransient() && !compareTo.IsTransient() && Id == compareTo.Id)
                return true;
            return false;
        }

IEquatable.Equals e Object.Equals override dovrebbero restituire lo stesso risultato. Pertanto se c'è una chiamata a IEquatable.Equals , chiama semplicemente l'override per Object.Equals .

È un approccio standard? Sto cercando di seguire il principio del minimo stupore. In alternativa, potrei semplicemente duplicare il codice in entrambi i metodi.

    
posta w0051977 23.01.2018 - 19:17
fonte

1 risposta

7

L'approccio più standard che ho visto è con i metodi definiti al contrario:

public virtual bool Equals(Entity other)
    {
        return other != null && ID == other.ID;
    }

public override bool Equals(object obj)
    {
        return Equals(obj as Entity);
    }

In questo modo non ti devi preoccupare di controllare che i tipi corrispondano, poiché è già tutto a posto. Come DocBrown ha menzionato nei commenti, però, l'importante è non duplicare il codice tra i metodi: un metodo chiama l'altro. Se la tua implementazione sopra funziona per te, non ci sono molti motivi per cambiarla.

    
risposta data 23.01.2018 - 20:04
fonte

Leggi altre domande sui tag