Question

J'ai une classe Person, il implémente la méthode Equals() de IEquatable<Person> (remplace également Object.Equals méthode, permet d'ignorer la GetHashcode() méthode pour l'instant)

class Person : IEquatable<Person>
{
    public string Name { get; set; }

    public bool Equals(Person other)
    {
        return this.Name == other.Name;
    }
    public override bool Equals(object obj)
    {
        var person = obj as Person;
        return person != null && person.Name == Name;
    }
}

Ok, permet de commencer:

Person p1 = new Person() { Name = "a" };
Person p2 = new Person() { Name = "a" };

List<Person> lst1 = new List<Person>() { p1 };
List<Person> lst2 = new List<Person>() { p2 };

Permet de parler de cette ligne :

 bool b = lst1.SequenceEqual(lst2, EqualityComparer<Person>.Default);

J'ai un problème de compréhension de cette partie :

EqualityComparer<Person>.Default

J'ai entendu dire que EqualityComparer<Person>.Default va vérifier si la classe est la mise en œuvre de IEquatable - il va prendre la Equals(Person other) Méthode et non pas le Equals(object obj). il a l'avantage d'éviter de boxe

enter image description here mais

l' Equals(Person other) sera exécuté avec ou sans EqualityComparer<Person>.Default (parce que c'est la mise en œuvre de IEquatable)

Donc, ce que la Boxe parlons-nous ?il n'y en a pas !

La seule fois que Equals(object obj) sera exécuté, c'est quand :

bool b = lst1.SequenceEqual(lst2,EqualityComparer<Object>.Default);

Mais Je suis un programmeur!Je ne vais jamais Envoyer un object lors de sa en fait Person!

Ce qui me manque?Je vais avoir de la difficulté à comprendre les avantages de EqualityComparer<Object>.Default.Quelqu'un peut-il me donner un exemple pour me prouver que je me trompe ?

Était-ce utile?

La solution

Si vous passez dans null en tant que second paramètre ou si vous ne passez pas dans un deuxième argument (qui est fondamentalement la même), la mise en œuvre de SequenceEquals fera appel EqualityComparer<T>.Default lui-même (décompiler Enumerable pour le vérifier).Qui explique pourquoi vous ne voyez pas une différence si vous fournissez EqualityComparer<T>.Default ou pas.

Donc à la fin de la deuxième paramètre n'a de sens que si vous voulez utiliser un comparateur d'égalité autres que EqualityComparer<T>.Default.

Autres conseils

Que vous pouvez passer IEqualityComparer<object>.Default est un effet de générique de la contravariance, a ajouté .NET 4.

Essentiellement, un IEqualityComparer<BaseType> peut être utilisée chaque fois qu'une IEqualityComparer<DerivedType> est nécessaire, où DerivedType : BaseType.Depuis Person dérive de Object, cela signifie qu'une IEqualityComparer<Object> peut être utilisé partout où un IEqualityComparer<Person> est requis.

La réponse est ici: http://msdn.microsoft.com/en-us/library/ms131187(v=vs. 110).aspx

Pour un type de valeur, vous devriez toujours mettre en œuvre IEquatable et de remplacer l'Objet.Equals(Object) pour de meilleures performances.Objet.Est égal à cases des types de valeur et s'appuie sur la réflexion de comparer deux valeurs pour l'égalité.À la fois votre mise en œuvre d'égal à Égal et votre remplacement de l'Objet.Est égal doit retourner des résultats cohérents.

Si vous ne remplacent pas d'égal à Égal et GetHashCode, EqualityComparer.Par défaut prend réellement soin de cela pour vous.

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