Uso ReSharper per generare membri di uguaglianza. Opzionalmente implementerà IEquatable<T>
e sostituirà gli operatori se lo si desidera (cosa che ovviamente non si fa mai, ma è comunque bello).
L'implementazione di Equals include un override di Object.Equals(Object)
, nonché una variante fortemente tipizzata (che può evitare il controllo di tipo non necessario). La versione meno tipizzata chiama quella fortemente tipizzata dopo aver eseguito un controllo di tipo. La versione fortemente tipizzata esegue un controllo di uguaglianza di riferimento (Object.ReferenceEquals(Object,Object)
) e quindi confronta i valori di tutti i campi (beh, solo quelli che si dice al generatore di includere).
Per quanto riguarda GetHashCode
, una fattorizzazione intelligente GetHashCode
valori del campo sono combinati (usando unchecked
per evitare eccezioni di overflow se si utilizza l'opzione del compilatore checked
). Ciascuno dei valori del campo (a parte il primo) viene moltiplicato per i numeri primi prima di essere combinato. È anche possibile specificare quali campi non sarebbero mai nulli e non genererà alcun controllo Null.
Ecco quello che si ottiene per la vostra classe Polygon
premendo ALT+Insert
quindi selezionando "Genera uguaglianza Utenti":
public class Polygon : IEquatable<Polygon>
{
public Point[] Vertices { get; set; }
public bool Equals(Polygon other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Equals(other.Vertices, Vertices);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof (Polygon)) return false;
return Equals((Polygon) obj);
}
public override int GetHashCode()
{
return (Vertices != null ? Vertices.GetHashCode() : 0);
}
}
Alcune delle caratteristiche di cui ho parlato sopra non si applicano in quanto v'è un solo campo . Nota anche che non ha controllato il contenuto dell'array.
In generale, tuttavia, ReSharper rilascia molto codice eccellente in pochi secondi. E quella caratteristica è piuttosto bassa nella mia lista di cose che rende ReSharper uno strumento così straordinario.
fonte
2009-06-07 22:44:15
Ti sembra di non essere alla ricerca di Equals generazione di codice, ma per un realizzatore algoritmo generico. Penso che tu sia sfortunato qui. – erikkallen