EqualityComparer & lt; T & gt; .Default vs. T.Equals

Angenommen, ich habe eine generische MyClass<T> muss zum vergleichen von zwei Objekten des Typs <T>. Normalerweise würde ich so etwas tun ...

void DoSomething(T o1, T o2)
{
  if(o1.Equals(o2))
  {
    ...
  }
}

Nehmen wir nun an meine MyClass<T> hat einen Konstruktor, der unterstützt das übergeben eines benutzerdefinierten IEqualityComparer<T> ähnlich Dictionary<T>. In diesem Fall würde ich tun müssen ...

private IEqualityComparer<T> _comparer;
public MyClass() {}
public MyClass(IEqualityComparer<T> comparer)
{
  _comparer = comparer;
}
void DoSomething(T o1, T o2)
{
  if((_comparer != null && _comparer.Equals(o1, o2)) || (o1.Equals(o2)))
  {
    ...
  }
}

Entfernen diese lange if-Anweisung, es wäre gut, wenn ich könnte _comparer standardmäßig ein 'Standard-Programm', wenn die normalen Konstruktor verwendet wird. Ich suchte nach etwas, wie typeof(T).GetDefaultComparer() aber nicht in der Lage war zu finden, alles wie es.

Habe ich EqualityComparer<T>.Defaultkönnte ich nutzen? Und würde dann dieses snippet ...

public MyClass()
{
  _comparer = EqualityComparer<T>.Default;
}
void DoSomething(T o1, T o2)
{
  if(_comparer.Equals(o1, o2))
  {
    ...
  }
}

... liefern die gleichen Ergebnisse wie die Verwendung o1.Equals(o2) für alle möglichen Fälle?

(Wie sehen a side note, würde es bedeuten, ich würde auch brauchen, um irgendwelche spezielle generische Einschränkung für <T>?)

InformationsquelleAutor der Frage takrl | 2011-05-02

Schreibe einen Kommentar