Ich habe einen Code wie diesen:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Der Fall ist mir egal. Soll ich OrdinalIgnoreCase
, InvariantCultureIgnoreCase
oder CurrentCultureIgnoreCase
?
.net
vb.net
localization
Dave Haynes
quelle
quelle
Antworten:
Neuere .Net Docs verfügen jetzt über eine Tabelle, anhand derer Sie entscheiden können, welche in Ihrer Situation am besten geeignet ist.
Aus MSDNs " Neue Empfehlungen für die Verwendung von Zeichenfolgen in Microsoft .NET 2.0 "
quelle
"Straße"
und"STRASSE"
. Bei der VerwendungOrdinalIgnoreCase
derEquals
Retourenfalse
, währendInvariantCultureIgnoreCase
sagt , dass sie gleich sind.Es hängt alles ab
Der Vergleich von Unicode-Zeichenfolgen ist schwierig:
Siehe: http://en.wikipedia.org/wiki/Unicode_equivalence
Wenn Sie versuchen, 2 Unicode-Zeichenfolgen ohne Berücksichtigung der Groß- und Kleinschreibung zu vergleichen und möchten, dass sie ÜBERALL funktionieren , haben Sie ein unmögliches Problem.
Das klassische Beispiel ist das türkische i , das in Großbuchstaben zu İ wird (beachten Sie den Punkt).
Standardmäßig verwendet das .Net-Framework die CurrentCulture für Zeichenfolgenfunktionen, mit einer sehr wichtigen Ausnahme
.Equals
, bei der ein Ordnungsvergleich (Byte für Byte) verwendet wird.Dies führt konstruktionsbedingt dazu, dass sich die verschiedenen Zeichenfolgenfunktionen je nach Computerkultur unterschiedlich verhalten.
Trotzdem wollen wir manchmal einen "allgemeinen Zweck", bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird.
Beispielsweise möchten Sie möglicherweise, dass sich Ihr Zeichenfolgenvergleich unabhängig vom Computer, auf dem Ihre Anwendung installiert ist, genauso verhält.
Um dies zu erreichen, haben wir 3 Möglichkeiten:
Unicode-Äquivalenzregeln sind kompliziert, was bedeutet, dass die Verwendung von Methode 1) oder 2) teurer ist als
OrdinalIgnoreCase
. Die Tatsache, dassOrdinalIgnoreCase
keine spezielle Unicode-Normalisierung durchgeführt wird, bedeutet, dass einige Zeichenfolgen, die auf einem Computerbildschirm auf dieselbe Weise gerendert werden, nicht als identisch angesehen werden. Zum Beispiel:"\u0061\u030a"
und"\u00e5"
beide rendern å. Bei einem Ordnungsvergleich wird dies jedoch als unterschiedlich angesehen.Welche Sie stark auswählen, hängt von der Anwendung ab, die Sie erstellen.
Microsoft hat seine Empfehlungen mit expliziten Richtlinien. Es ist jedoch sehr wichtig, den Begriff der Unicode-Äquivalenz zu verstehen, bevor diese Probleme angegangen werden.
Denken Sie auch daran, dass OrdinalIgnoreCase eine ganz besondere Art von Bestie ist, bei der ein bisschen Ordnungszahl ausgewählt und ausgewählt wird, verglichen mit einigen lexikografischen Aspekten. Dies kann verwirrend sein.
quelle
Ich denke, es hängt von Ihrer Situation ab. Da bei Ordnungsvergleichen tatsächlich die numerischen Unicode-Werte der Zeichen berücksichtigt werden, sind sie nicht die beste Wahl, wenn Sie alphabetisch sortieren. Für Zeichenfolgenvergleiche wäre die Ordnungszahl jedoch etwas schneller.
quelle
Es hängt davon ab, was Sie wollen, obwohl ich mich vor invarianter Kultur scheuen würde, es sei denn, Sie sind sich sehr sicher, dass Sie den Code für andere Sprachen niemals lokalisieren möchten. Verwenden Sie stattdessen CurrentCulture.
Außerdem sollte OrdinalIgnoreCase Zahlen berücksichtigen, die möglicherweise Ihren Wünschen entsprechen oder nicht.
quelle
Die sehr einfache Antwort lautet: Wenn Sie kein Türkisch verwenden, müssen Sie InvariantCulture nicht verwenden.
Siehe folgenden Link:
Was ist in C # der Unterschied zwischen ToUpper () und ToUpperInvariant ()?
quelle