Question

Chaque fois que j'écris une classe de données, je passe généralement beaucoup de temps à écrire la mise en œuvre IEquatable.

La dernière classe que j'ai écrit était quelque chose comme:

public class Polygon
{
    public Point[] Vertices { get; set; }
}

Mise en œuvre IEquatable était exaustive. Sûrement C # 3.0 / LINQ aide beaucoup, mais les sommets peut être déplacé et / ou dans l'ordre inverse, et qui ajoute beaucoup de complexité à la méthode Equals. Après de nombreux tests unitaires, et la mise en œuvre correspondant, j'ai donné, et changé ma demande d'accepter que des triangles, qui mise en œuvre IEquatable requis seulement 11 tests unitaires à être couverts.

Il y a un outil ou une technique qui aide à la mise en œuvre et Equals GetHashCode?

Était-ce utile?

La solution

J'utilise ReSharper pour générer les membres de l'égalité. Il en option la mise en œuvre IEquatable<T> ainsi que les opérateurs prépondérants si vous voulez que (ce qui bien sûr vous ne faites jamais, mais il est cool de toute façon).

La mise en œuvre de Equals comprend une substitution de Object.Equals(Object), ainsi qu'une variante fortement typé (qui permet d'éviter la vérification de type inutile). La moindre version dactylographiée appelle fortement typée un après avoir effectué une vérification de type. La version fortement typé effectue une vérification de l'égalité de référence (Object.ReferenceEquals(Object,Object)) et compare ensuite les valeurs de tous les champs (bien, seulement ceux que vous dites au générateur d'inclure).

En ce qui concerne GetHashCode, une factorisation intelligente des valeurs GetHashCode du terrain sont combinés (à l'aide unchecked pour éviter des exceptions de débordement si vous utilisez l'option checked du compilateur). Chacune des valeurs (à l'exception de la première) du champ sont multipliés par des nombres premiers avant d'être combinés. Vous pouvez également spécifier quels champs ne serait jamais nul, et il va déposer des chèques nuls.

Voici ce que vous obtenez pour votre classe Polygon en appuyant sur ALT+Insert puis en sélectionnant " Générer l'égalité des membres ":

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);
    }
}

Certaines des caractéristiques dont j'ai parlé ci-dessus ne sont pas applicables car il n'y a qu'un seul champ. Notez aussi qu'il n'a pas vérifié le contenu du tableau.

En général cependant, les pompes à ReSharper beaucoup de code excellente en seulement quelques secondes. Et cette fonction est assez bas sur ma liste de choses qui fait ReSharper un tel outil étonnant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top