Warum funktioniert der erste Vergleich (string.compare) und die anderen beiden? Vergleichsmethoden funktionieren nicht in diesem speziellen Fall
Es gibt unsichtbare Zeichen (insbesondere eine von links nach rechts sichtbare Marke (Danke @MatthewWatson) ) in deinem Code. Sie können sie mit jedem Hex-Editor anzeigen:
Dies wird von string.Compare
überschrieben, während es nicht mit string.Equals
ist. Sie können es in den Dokumenten sehen:
Hinweise für Anrufer:
Zeichensätze enthalten ignorierbare Zeichen. Das Compare (String, String) Methode berücksichtigt solche Zeichen nicht wann es führt einen kultursensitiven Vergleich durch. Zum Beispiel, wenn der Der folgende Code wird auf .NET Framework 4 oder höher ausgeführt: a kultursensitiver Vergleich von "Tier" mit "Tier" (mit einem Bindestrich oder U + 00AD) gibt an, dass die beiden Zeichenfolgen äquivalent sind.
Die Zeichenfolge ExecutionDay
enthält unsichtbare Zeichen, andernfalls wären alle Prüfungen wahr
Die folgenden Zeilen geben eine andere Länge zurück, 9 bzw. 8
%Vor%Es gibt ein "unsichtbares" Zeichen am Anfang von
%Vor%und es ist die LINKS-NACH-RECHTS-MARKE . Sie können es überprüfen mit:
%Vor%und
%Vor%Kurz gesagt ist CompareTo kulturabhängig. Zum Beispiel ß (s scharf aus Deutsch) :
%Vor%Wird ausgedruckt
%Vor%In Ihrem Fall haben Sie eine Zeichenfolge, die gleich aussieht, aber unterschiedlich ist. Normalerweise finde ich es hilfreich, den Unterschied zu sehen, dies kann gemacht werden mit:
%Vor%führt zur Zeichenanzahl-Codeliste:
%Vor% Wo das Zeichen 8206
in Unicode left-to-right mark
ist.
Dies vergleicht NUR Werte, wenn es sich um einen Werttyp oder ein Grundelement handelt. Anders als das ist es und sollte als Vergleich verwendet werden. In C # ist der Typ string speziell und beide der folgenden beiden Assertions würden true ergeben:
%Vor%In Java wird jedoch zuerst der wahre JIT-Laufzeitoptimierer zurückgegeben, der alle eindeutigen Zeichenfolgen aus dem Code sammelt und eine Tabelle erstellt, die verwendet wird. Zweitens ein false, da der String nur ein unveränderliches Zeichenarray ist und wenn er vom Benutzer eingegeben wird, wird ein neuer Speicherplatz verwendet, so dass der Referenzvergleich false zurückgibt.
C # -Richtlinien für die Implementierung von Equals und des Gleichheitsoperators (== )
Im Gegensatz zu == Die Equals-Methode ist nur eine virtuelle Methode, die in System.Object definiert und von den Klassen überschrieben wird, die dies tun. Daher wird die überschriebene Version verwendet und im Falle eines String-Typs bedeutet dies, dass der Inhalt verglichen wird.
Befolgen Sie diese Richtlinien beim Überschreiben von Equals (Object):
- Typen, die IComparable implementieren, müssen Equals (Object) überschreiben.
- Typen, die Equals (Object) überschreiben, müssen auch GetHashCode überschreiben; Andernfalls funktionieren Hashtabellen möglicherweise nicht korrekt.
- Sie sollten die IEquatable-Schnittstelle implementieren, um stark typisierte Tests auf Gleichheit zu unterstützen. Ihre IEquatable.Equals Die Implementierung sollte Ergebnisse zurückgeben, die mit Equals übereinstimmen.
- Wenn Ihre Programmiersprache das Überladen von Operatoren unterstützt und Sie den Gleichheitsoperator für einen bestimmten Typ überladen, müssen Sie auch Überschreiben Sie die Equals (Object) -Methode, um das gleiche Ergebnis wie das zu erhalten Gleichheitsoperator. Dadurch wird sichergestellt, dass der Klassenbibliothekscode verwendet wird Gleiches (wie ArrayList und Hashtable) verhält sich in einer Art und Weise konsistent mit der Art, wie der Gleichheitsoperator von applicat
verwendet wird
C # Implementierung der Equals-Methode
>Vorsicht
Die Methode CompareTo wurde in erster Linie für Verwenden Sie bei Sortier- oder Alphabetisierungsvorgängen. Es sollte nicht verwendet werden, wenn Der Hauptzweck des Methodenaufrufs besteht darin, zu bestimmen, ob zwei Zeichenfolgen sind gleichwertig. Um festzustellen, ob zwei Strings sind Äquivalent, rufen Sie die Equals-Methode auf.
Diese Methode führt einen wortweisen (case-sensitive und culture-sensitive) Vergleich unter Verwendung der aktuellen Kultur durch. Weitere Informationen zu Wort-, Zeichenfolgen- und Ordnungssortierungen finden Sie unter System.Globalization.CompareOptions.
Quelle: Handbuch
Tags und Links string .net c# string-comparison