C # String-Vergleiche: Unterschied zwischen CurrentCultureIgnoreCase und InvariantCultureIgnoreCase

StackOverflow https://stackoverflow.com/questions/417954

  •  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?

War es hilfreich?

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.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top