C # String-Vergleiche: Unterschied zwischen CurrentCultureIgnoreCase und InvariantCultureIgnoreCase
-
03-07-2019 - |
Frage
Wenn Sie einen String-Vergleich in C # zu tun, was ist der Unterschied zwischen tun a
string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);
und
string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase);
... und ist es wichtig, dass zusätzliche Parameter, trotzdem zu schließen?
Lösung
Microsoft gibt ein paar anständige Führung für, wenn die InvariantCulture
Eigenschaft verwenden:
MSDN: CultureInfo.InvariantCulture Property
... sollte eine Anwendung verwenden, die invariante Kultur nur für Prozesse die erfordern, kulturunabhängige Ergebnisse, wie die Formatierung und Parsen von Daten, die auf ein beibehalten Datei. In anderen Fällen ist es produziert Ergebnisse, die sprachlich sein könnte falsche oder kulturell unangemessen.
Überlegungen zur Sicherheit
Wenn eine Sicherheits entschieden werden, basierend auf dem Ergebnis eines Strings Vergleich oder Fall ändern, Ihre Anwendung sollte eine Ordnungs verwenden Vergleich, der stattdessen Fall ignoriert die Verwendung von InvariantCulture. [...]
String Operationen
Wenn Ihre Anwendung ein ausführen kultursensible String-Operation dass nicht durch den Wert beeinflusst von Current, sollte es eine Methode verwenden, dass akzeptiert einen Culture Parameter. [...]
Persistierende Daten
Die InvariantCulture Eigenschaft ist nützlich zum Speichern von Daten, die nicht wird direkt an den Nutzer angezeigt. Das Speichern von Daten in einem kulturunabhängige Format garantiert ein bekanntes Format, das ändert sich nicht. Wenn Benutzer von verschiedene Kulturen auf die Daten zugreifen, sie kann in geeigneter Weise basierend formatiert werden auf bestimmten Benutzer. [...]
Andere Tipps
Die anderen Beiträge haben gute Ratschläge gegeben, aber ich dachte, es wäre nett ein Beispiel zu zeigen, wo es macht definitiv einen Unterschied:
using System;
using System.Globalization;
using System.Threading;
class Test
{
static void Main()
{
CultureInfo turkish = CultureInfo.CreateSpecificCulture("tr");
Thread.CurrentThread.CurrentCulture = turkish;
// In Turkey, "i" does odd things
string lower = "i";
string upper = "I";
Console.WriteLine(lower.Equals(upper,
StringComparison.CurrentCultureIgnoreCase));
Console.WriteLine(lower.Equals(upper,
StringComparison.InvariantCultureIgnoreCase));
}
}
(Es gibt keinen Zweifel, viele andere Fälle - das war nur der erste, den ich gedacht.)