Was ist die invariante Kultur?

173

Könnte jemand ein Beispiel geben, um die Verwendung der invarianten Kultur zu demonstrieren ? Ich verstehe nicht, was die Dokumentation beschreibt.

Ricky
quelle
14
Es ist Englisch, ist aber keinem Ort zugeordnet.

Antworten:

132

Die invariante Kultur ist eine spezielle Kultur, die nützlich ist, weil sie sich nicht ändert. Die aktuelle Kultur kann sich von einem Benutzer zum anderen oder sogar von einem Lauf zum anderen ändern, sodass Sie sich nicht darauf verlassen können, dass sie gleich bleibt.

Die Möglichkeit, jedes Mal dieselbe Kultur zu verwenden, ist in mehreren Flüssen sehr wichtig, z. B. bei der Serialisierung: Sie können in einer Kultur einen Wert von 1,1 und in einer anderen einen Wert von 1,1 haben. Wenn Sie versuchen, den Wert "1,1" in der zweiten Kultur zu analysieren, schlägt die Analyse fehl. Sie können jedoch die invariante Kultur verwenden, um eine Zahl in eine Zeichenfolge zu konvertieren und sie später von jedem Computer mit einem beliebigen Kultursatz zurück zu analysieren.

// Use some non-invariant culture.
CultureInfo nonInvariantCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = nonInvariantCulture;

decimal dec = 1.1m;
string convertedToString = dec.ToString();

// Simulate another culture being used,
// following code can run on another computer.
nonInvariantCulture.NumberFormat.NumberDecimalSeparator = ",";

decimal parsedDec;

try
{
    // This fails because value cannot be parsed.
    parsedDec = decimal.Parse(convertedToString);
}
catch (FormatException)
{
}

// However you always can use Invariant culture:
convertedToString = dec.ToString(CultureInfo.InvariantCulture);

// This will always work because you serialized with the same culture.
parsedDec = decimal.Parse(convertedToString, CultureInfo.InvariantCulture);
Andrew Bezzub
quelle
9
Für das, was es wert ist, ist dies im System.GlobalizationNamespace.
Jim H.
1
Dies wird immer funktionieren, weil Sie mit derselben Kultur serialisiert haben. << Das ergab für mich keinen Sinn. Ich glaube, ich habe etwas falsch verstanden. Wenn die Verwendung CultureInfo.InvariantCulturefunktioniert, weil Sie mit derselben Kultur serialisiert haben ... ist es dann nicht dasselbe wie die Verwendung CultureInfo.CurrentCulture?
Alisson
3
@Alisson Wenn Sie Andrews letzte beiden Code-Anweisungen wieder in den ursprünglichen Ablauf einfügen, wird dies meiner Meinung nach sinnvoller sein. Wenn Sie immer mit serialisieren, CultureInfo.InvariantCulturewissen Sie, dass Sie immer mit auf eine Dezimalzahl zurückgreifen können CultureInfo.InvariantCulture. Wenn Sie CultureInfo.CurrentCulturezum Serialisieren verwenden, hat Ihr Benutzer möglicherweise "en-US" als aktuelle Kultur. Der nächste Benutzer, der es zurück auf eine Dezimalstelle analysiert, verfügt möglicherweise über eine aktuelle Kultur, die "," als Trennzeichen verwendet.
David Specht
1
@ Andrew Vielleicht bin ich dicht, aber ich konnte nicht verstehen, was du gesagt hast, ohne Davids Kommentar. Ich habe Ihre Antwort so bearbeitet, dass sie explizit ist.
Jpaugh
111

Eine gefälschte Kultur basierend auf Englisch mit definiertem Verhalten. Hervorragend geeignet, um beispielsweise Inhalte in Konfigurationsdateien zu schreiben, damit diese unabhängig von der vom Benutzer definierten Kultur gelesen und geschrieben werden können.

Grundsätzlich ist es eine spezifische Kultur, die künstlich ist und sich nicht ändern wird .

TomTom
quelle
4
Insbesondere werden Sie nicht durch unterschiedliche Verwendungen von Kommas und Punkten in den Zeichenfolgenformen von Zahlen oder durch Konvertierungen in ungeraden Groß- und Kleinschreibung überrascht.
Steve Gilham
8
Ja ... typisches Problem für: * amerikanische Programmierer, die das Wort für englisch halten;) Und dann schreiben deutsche Kunden 1.000,00 für 1000;) Autsch. * Auch in derselben Sprache verwenden die Schweiz und Deutschland beispielsweise "." und "," auf unterschiedliche Weise in Zahlen. Ergebnis -> Konfigurationsdateien sind Müll. Verwenden Sie dort Invariant Language;)
TomTom
23
Um Steves Kommentar zu ergänzen: Es ist die Kultur, die verwendet werden muss, wenn es Ihnen eigentlich egal ist, wie die Dinge aussehen (es ist Ihnen egal, ob Kommas oder Punkte oder was auch immer verwendet werden, weil der Benutzer sie nie sehen wird), aber Sie brauchen sie immer um gleich zu sein (zB weil Sie in der Lage sein müssen, in dem zu lesen, was Sie geschrieben haben).
Itowlson
7

Es wird für Dinge verwendet, die unabhängig von der Kultur gleich sind (die nicht in eine Kultur X übersetzt werden müssen, um angemessen zu sein).

Beispiel: https://msdn.microsoft.com/en-us/library/4c5zdc6a(v=vs.100).aspx . Wenn Sie eine app-spezifische Datei schreiben, mit der der Benutzer nicht herumspielen sollte, sollten Sie InvariantCulture für alle Methoden verwenden, die einen Kulturparameter berücksichtigen.

Beachten Sie, dass gemäß den oben verlinkten Dokumenten:

Eine Anwendung sollte die invariante Kultur jedoch nur für Prozesse verwenden, die kulturunabhängige Ergebnisse erfordern, z. B. das Formatieren und Parsen von Daten, die in einer Datei gespeichert bleiben.

Gishu
quelle
3
Dies spricht für die Konsequenz, dass die invariante Kultur nur als Zwischenformat gedacht ist, dh wenn Sie dem Benutzer Dinge anzeigen, die die Ausgabe der invarianten Kultur sind (dh in der invarianten Kultur), die Sie tun etwas stimmt nicht und verstehe die unveränderliche Kultur nicht.
mlhDev
3

Die invariante Kultur ist kulturunempfindlich; Es ist mit der englischen Sprache verbunden, aber nicht mit einem Land / einer Region.

CultureInfo.InvariantCulture ruft eine Instanz der invarianten Kultur ab. Es kann in fast jeder Methode im System.Globalization-Namespace verwendet werden, für die eine Kultur erforderlich ist.

Die von Eigenschaften wie CompareInfo, DateTimeFormat und NumberFormat zurückgegebenen Objekte spiegeln auch die Konventionen für Zeichenfolgenvergleich und Formatierung der invarianten Kultur wider. Die InvariantCulture-Eigenschaft ist praktisch, wenn Sie persistente Daten in einem kulturunabhängigen Format anzeigen möchten .

Wenn Sie beispielsweise eine Zahl oder eine Uhrzeit in einem bestimmten Format unabhängig von der aktuellen Kultur der Anwendung anzeigen möchten, können Sie CultureInfo.InvariantCulture verwenden .

CharithJ
quelle
0

Es ist eine universelle einfache, nicht regional spezifische englische Sprache und andere verwandte Informationen. Es ist wie die Sprache der Programmiersprache. Sie können sich beim Einrichten eines universellen Kalenders darauf verlassen. in Situationen, in denen Sie Controllernamen, URLs, Delegatennamen usw. generieren müssen. und brauchen Dinge, um unter allen Benutzern natürlich und universell zu handeln.

Shadi Namrouti
quelle