Wie funktioniert EqualityComparerT.Default intern?

8

Betrachte T = string.

Ich bin neugierig, ob es so etwas wie: typeof(EqualityComparer<T>).GetInterface("IEqualityComparer<T>");

verwendet

Irgendwelche Vorschläge ..

    
Sadiq 31.01.2013, 11:29
quelle

2 Antworten

9

Mit freundlicher Genehmigung von Reflector:

%Vor%

Wie Sie sehen können, wenn T = string, gibt es GenericEqualityComparer<string> zurück.

    
Darin Dimitrov 31.01.2013, 11:31
quelle
2

EqualityComparer<T>.Default funktioniert durch Aufrufen der virtual -Methoden Equals(object) und GetHashCode() , die durch System.Object definiert sind, aber möglicherweise von T überschrieben werden.

Beachten Sie, dass, da die Metoden virtual sind, eine Implementierung einer abgeleiteten Klasse als T verwendet werden kann. Zum Beispiel:

%Vor%

gibt true zurück, auch wenn

%Vor%

und

%Vor%

beide geben false zurück.

Wenn T % string ist, überlädt die Klasse System.String die beiden fraglichen Methoden und verwendet einen ordinalen Vergleich. In diesem Fall sollte es also System.StringComparer.Ordinal entsprechen. Und natürlich ist string eine sealed -Klasse, also könnte keine andere Klasse von string abgeleitet werden und Equals und GetHashCode auf eine seltsame Weise überschreiben.

    
Jeppe Stig Nielsen 31.01.2013 11:36
quelle

Tags und Links