2016-08-02 19 views
2

ich mit C# messed ein wenig und einen Code gefunden, der sehr unbequem Ergebnisse liefert:C# String: warum String a == b Operator gibt andere Antwort als a.CompareTo (b) == 0?

static void Main(string[] args) 
    { 
     string a = "string", b = "string\0"; 
     bool b1 = a == b; 
     bool b2 = (a.CompareTo(b) > 0); 
     bool b3 = (a.CompareTo(b) < 0); 
     bool b4 = (a.CompareTo(b) == 0); 
     Console.WriteLine(a); 
     Console.WriteLine(b); 
     Console.WriteLine("{0} {1} {2} {3}", b1, b2, b3, b4); 
    } 

Ausgang:

string 
string 
False False False True 

Erwartete Ausgabe (auf dem):

string 
string 
True False False True 
+0

Könnten Sie Ihren Beitrag bearbeiten und die erwartete Ausgabe hinzufügen? –

Antwort

8

Das Ergebnis von CompareTo impliziert keine Gleichheit, es bezieht sich auf die Sortierreihenfolge. Ich bin mir nicht sicher, dass es zu überraschend ist, dass das Nullzeichen zum Sortieren ignoriert wird.

Per the documentation:

Zeichensätze umfassen ignorable Zeichen. Die CompareTo (String) -Methode berücksichtigt solche Zeichen nicht, wenn sie einen kulturabhängigen Vergleich durchführt.

+0

Wenn Sie nach der äquivalenten Methode suchen, verwenden Sie a.Equals (b) – TwistedStem

+0

Es kann jedoch ein Sicherheitsproblem oder ein Fehler sein, der annimmt, dass 'CompareTo() == 0' dasselbe Ergebnis wie der Gleichheitsoperator ergibt. – nikartix

0

String.CompareTo Gibt 0 zurück, wenn die String-Instanz dieselbe Position in der Sortierreihenfolge wie der angegebene Wert hat. Dies ist etwas anderes als der Vergleich der Gleichheit. Also ich würde das Ergebnis erwarten, wie du es beschreibst.

1

Sie wollen StringComparison.Ordinal Flagge: nur Strings lexikographisch vergleichen:

... 
bool b2 = (a.CompareTo(b, StringComparison.Ordinal) > 0); 
bool b3 = (a.CompareTo(b, StringComparison.Ordinal) < 0); 
bool b4 = (a.CompareTo(b, StringComparison.Ordinal) == 0); 
...