2013-02-19 7 views
7

, warum Equals() Methode überprüfen Sie immer die Gleichheit zwischen zwei arrays durch den Vergleich der Referenzen und nicht durch den Inhalt zu vergleichen?In C#, warum Equals() -Methode auf Arrays nur ihre Referenzen vergleichen, nicht ihre tatsächlichen Inhalt

Als Folge werden alle Methoden Equals() bei deren Umsetzung (viel) Aufruf funktioniert nicht wie mit Arrays erwartet (es nicht vergleichen den Inhalt):

Beispiel:

int[] array1 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; 
int[] array2 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; 

var u = array1.Equals(array1);          //true 
var v = array1.Equals(array2);          //false 
var w = Array.Equals(array1, array2);        //false 
var x = (new List<int[]>(new int[][] { array1 })).Contains(array2); //false 
var y = (new int[][] { array1 }).Any(x => x == array2);    //false 
var z = (new int[][] { array1, array2 }).Distinct().Count() == 1; //false 

A möglich generische Möglichkeit, Arrays (keine Art) zu behandeln könnte sein:

In Object.Equals(): wenn beide Typen zu vergleichen sind Arrays (von gleicher Länge), Elemente aufzählen (immer möglich), rufen Sie für jeden Artikel Equals(). Wenn einer dieser Aufrufe false zurückgibt, sind die Arrays unterschiedlich (geben Sie false zurück), andernfalls geben Sie true zurück.

Hinweis: Ich weiß über SequenceEqual(), memcmp() und andere Möglichkeiten, zwei Arrays zu vergleichen. Meine Frage ist nicht, wie man Arrays vergleicht. Ich möchte nur wissen, warum C # Designer nicht wählen, um eine vollständige Array-Vergleich in Equals() Methode zu implementieren.

+1

Interessante Frage, auch wenn es schwer zu beantworten sein wird (die Schnittmenge von SO-Benutzern und C# -Teammitgliedern ist ein ziemlich kleines Set). – Jon

+1

Wir könnten theoretisieren, aber da die Leute, die die Entscheidung getroffen haben, höchst unwahrscheinlich hierher kommen, kann keiner von uns realistisch die Frage beantworten, was das C# -Team dachte, selbst wenn wir Gründe dafür hätten, dass wir die Entscheidung nicht selbst treffen würden. – Servy

+0

Betrachten Sie zwei Arrays mit jeweils 100.000 Elementen, die sehr komplexe Objekte enthalten, von denen jedes seine eigene überschriebene "Equals" -Methode besitzt, die eine Tiefeninspektion des Objekts durchführt, um auch die Gleichheit zu berücksichtigen. Sie könnten sich leicht in den Fuß schießen, indem Sie tun, was Sie vielleicht denken, ist eine einfache Überprüfung der Gleichheit. – CodingGorilla

Antwort

5

Obwohl Framework-Klassen der Microsoft sind leider etwas inkonsistent in Bezug auf das, was Object.Equals(Object) Mittel, nur im allgemeinen X.Equals(Y) wahr ist, wenn beliebige Verweise auf X mit Verweisen auf Y ersetzen und/oder umgekehrt, nicht zu ändern, wäre zu erwarten, die Semantik der betreffenden Objekte. Wenn beispielsweise X eine String mit dem Inhalt "Hello" ist und Y eine andere Zeichenfolge mit demselben Inhalt ist, würde das Ersetzen von Verweisen auf eine Zeichenfolge mit Verweisen auf die andere ihr Verhalten im Allgemeinen nicht ändern. Obwohl Code, der ReferenceEquals verwendet, um zu testen, ob sich zwei Zeichenfolgenverweise auf dieselbe Zeichenfolge beziehen, den Schalter möglicherweise bemerkt, würde normaler Zeichenfolgencode nicht.

In der Regel ist kein veränderbares Objekt äquivalent zu einem anderen und daher sollte kein Verweis auf ein veränderbares Objekt dem anderen äquivalent sein, es sei denn, beide Referenzen beziehen sich auf das Objekt . Es gibt einen großen Unterschied zwischen Referenzen auf zwei verschiedene Instanzen von int[], die beide die gleichen Werte enthalten, gegenüber zwei Referenzen auf dieselbe Instanz. Während es ArrayItemsEqualItemsEqual Methoden hilfreich wäre, die testen würden, ob alle Elemente der Arrays oder bestimmte Bereiche von Elementen übereinstimmen, und es wäre hilfreich, einen ImmutableArray Typ mit einem Equals/GetHashCode Mitglieder, die als gleich betrachten würde Zwei unveränderliche Arrays mit dem gleichen Inhalt, es ist völlig richtig und angemessen, dass unterschiedliche mutierbare Arrays unabhängig vom Inhalt ungleich miteinander verglichen werden.

Verwandte Themen