String.Equals vs String.Compare vs "==" in Aktion. Erklärung benötigt

8

Nachfolgend finden Sie das Code-Snippet aus einer Konsolenanwendung -

%Vor%

Frage ist - Warum funktioniert der erste Vergleich (string.compare) und die beiden anderen Vergleichsmethoden funktionieren nicht in diesem speziellen Fall?

    
Subhasis 17.06.2015, 07:31
quelle

4 Antworten

13
  

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.

    
Yuval Itzchakov 17.06.2015, 07:37
quelle
3

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%     
Panagiotis Kanavos 17.06.2015 07:37
quelle
1

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%     
xanatos 17.06.2015 07:42
quelle
0

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.

== Vergleich

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 (== )

Entspricht dem Vergleich

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

>

Verglichen mit Vergleich

  

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

    
Margus 17.06.2015 08:10
quelle

Tags und Links