Was ist los mit ToLowerInvariant ()?

77

Ich habe die folgende Codezeile:

var connectionString = configItems.
                Find(item => item.Name.ToLowerInvariant() == "connectionstring");

Die VS 2010-Code-Analyse sagt mir Folgendes:

Warnung 7 CA1308: Microsoft.Globalization: In Methode ... ersetzen Sie den Aufruf von 'string.ToLowerInvariant ()' durch String.ToUpperInvariant ().

Bedeutet das, dass ToUpperInvariant()es zuverlässiger ist?

J L.
quelle
33
Beachten Sie jedoch, dass die Verwendung string.Equals(item.Name, "connectionstring", StringComparison.OrdinalIgnoreCase)in diesem speziellen Fall wahrscheinlich der beste Ansatz ist.
Greg Beech

Antworten:

114

Google gibt einen Hinweis auf CA1308: Normalisieren Sie Zeichenfolgen in Großbuchstaben

Es sagt:

Zeichenfolgen sollten auf Großbuchstaben normalisiert werden. Eine kleine Gruppe von Zeichen kann keine Rundreise machen, wenn sie in Kleinbuchstaben umgewandelt werden. Eine Rundreise zu machen bedeutet, die Zeichen von einem Gebietsschema in ein anderes Gebietsschema zu konvertieren, das die Zeichendaten unterschiedlich darstellt, und dann die ursprünglichen Zeichen aus den konvertierten Zeichen genau abzurufen.

Also ja - ToUpper ist zuverlässiger als ToLower.

In Zukunft schlage ich vor, zuerst zu googeln - das mache ich für all die FxCop-Warnungen, die ich herumwerfe;) Hilft sehr beim Lesen der entsprechenden Dokumentation;)

TomTom
quelle
13
+1 für "Hilft viel beim Lesen der entsprechenden Dokumentation" (und auch um absolut korrekt zu sein ...)
gehho
Richtig, einige polnische Zeichen machen keine ToLower () -Rundreise.
Chris Ballance
14
@ChrisBallance & TomTom Können Sie ein Beispiel nennen, bei dem der Roundtrip-Fehler zu unerwünschtem Verhalten führt?
Ohad Schneider
25
Die Bemerkungen "Ich schlage vor, zuerst zu googeln" sind so nervig und nutzlos. Dies ist das 1. Google-Ergebnis.
Bartosz
7
Ich habe es googelt und bin hier mit dem ersten Ergebnis
gelandet
23

Neben den Aussagen von TomTom ist .net für den Vergleich von Zeichenfolgen in Großbuchstaben optimiert. Die Verwendung der oberen Invariante ist also theoretisch schneller als die Verwendung der unteren Invariante.

Dies wird in der Tat in CLR über C # angegeben, wie in den Kommentaren ausgeführt. Der folgende Link zitiert diesen Teil des Buches. Ich bin mir nicht sicher, ob dies wirklich wahr ist, da auf MSDN zu diesem Thema nichts zu finden ist. Der String-Vergleichsleitfaden auf msdn erwähnt, dass toupperinvariant und tolowerinvariant gleich sind und erstere nicht bevorzugen.

Zeichenfolgenvergleiche in C #

Henri
quelle
+1 wahr. Ich habe vor einigen Tagen tatsächlich darüber gelesen und war ziemlich überrascht, dass es einen Unterschied gibt. Ich denke jedoch, dass der Unterschied ziemlich gering sein sollte.
gehho
Irgendein Hinweis darauf? 10 Jahre .NET machen und als sehr gut angesehen werden - das wusste ich nicht;) Würde gerne eine Referenz haben.
TomTom
2
Ich glaube, ich habe das in CLR über C # (J Richter) gesehen. Verwenden Sie dennoch lieber einen expliziten StringComparer.
Phil Gan
Der Link scheint tot zu sein.
Soner Gönül