Quelle est la culture invariante?

173

Quelqu'un pourrait-il donner un exemple pour démontrer l'utilisation de la culture invariante ? Je ne comprends pas ce que décrit la documentation.

Ricky
la source
14
C'est l'anglais, mais n'est associé à aucun endroit.

Réponses:

132

La culture invariante est une culture spéciale qui est utile car elle ne changera pas. La culture actuelle peut changer d'un utilisateur à un autre, ou même d'une exécution à une autre, vous ne pouvez donc pas vous fier à ce qu'elle reste la même.

Pouvoir utiliser la même culture à chaque fois est très important dans plusieurs flux, par exemple, la sérialisation: vous pouvez avoir 1,1 valeur dans une culture et 1,1 dans une autre. Si vous essayez d'analyser la valeur «1,1» dans la deuxième culture, l'analyse échouera. Cependant, vous pouvez utiliser la culture invariante pour convertir un nombre en chaîne et l'analyser ultérieurement à partir de n'importe quel ordinateur avec un ensemble de cultures.

// 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
la source
9
Pour ce que ça vaut, c'est dans l' System.Globalizationespace de noms.
Jim H.
1
Cela fonctionnera toujours parce que vous avez sérialisé avec la même culture << cela n'a pas de sens pour moi, je pense que j'ai mal compris quelque chose. Si l'utilisation CultureInfo.InvariantCulturefonctionne parce que vous avez sérialisé avec la même culture ... alors n'est-ce pas la même chose que l'utilisation CultureInfo.CurrentCulture?
Alisson
3
@Alisson Si vous remettez les deux dernières instructions de code d'Andrew dans le flux d'origine, je pense que cela aura plus de sens. Si vous sérialisez toujours en utilisant, CultureInfo.InvariantCulturevous savez que vous serez toujours en mesure d'analyser en retour à une décimale en utilisant CultureInfo.InvariantCulture. Si vous utilisez CultureInfo.CurrentCulturepour sérialiser, votre utilisateur peut avoir "en-US" comme culture actuelle. Le prochain utilisateur qui va l'analyser en une décimale peut avoir une culture actuelle qui utilise "," comme séparateur.
David Specht
1
@Andrew Peut-être que je suis dense, mais je ne pouvais pas comprendre ce que vous disiez, sans le commentaire de David. J'ai édité votre réponse pour être explicite.
jpaugh
111

Une fausse culture basée sur l'anglais avec un comportement défini. Idéal pour écrire, par exemple, des éléments dans des fichiers de configuration afin qu'ils puissent être lus et écrits quelle que soit la culture définie par l'utilisateur.

Fondamentalement, c'est une culture spécifique qui est artificielle et qui ne changera pas .

TomTom
la source
4
Plus précisément, vous ne serez pas surpris par les différentes utilisations des virgules et des points dans les formes de chaîne de nombres ou par les conversions de cas impairs.
Steve Gilham
8
Oui ... problème typique pour: * Les programmeurs américains qui pensent que le mot est anglais;) Et puis les clients allemands écrivent 1.000,00 pour 1000;) Aïe. * Même dans la même langue, la Suisse et l'Allemagne par exemple utilisent "." et "," de différentes manières en nombres. Résultat -> Les fichiers de configuration sont des déchets. Utiliser le langage invariant ici;)
TomTom
23
Pour ajouter au commentaire de Steve: c'est la culture à utiliser lorsque vous ne vous souciez pas vraiment de l' apparence des choses (vous ne vous souciez pas de savoir si cela utilise des virgules, des points ou autre, car l'utilisateur ne le verra jamais) mais vous en avez toujours besoin être le même (par exemple parce que vous devez être capable de lire ce que vous avez écrit).
itowlson
7

Il est utilisé pour des choses qui sont les mêmes quelle que soit la culture (qui n'a pas besoin d'être traduit dans une culture X pour être appropriée)

comme exemple - https://msdn.microsoft.com/en-us/library/4c5zdc6a(v=vs.100).aspx . Lorsque vous écrivez un fichier spécifique à une application avec lequel l'utilisateur ne devrait pas jouer, vous devez utiliser InvariantCulture pour toutes les méthodes qui prennent un paramètre de culture.

Notez que selon les documents liés ci-dessus:

Toutefois, une application doit utiliser la culture invariante uniquement pour les processus qui nécessitent des résultats indépendants de la culture, tels que la mise en forme et l'analyse des données qui sont conservées dans un fichier.

Gishu
la source
3
Cela témoigne du corollaire que la culture invariante est uniquement destinée à être un format intermédiaire, c'est-à-dire que si vous affichez des éléments à l'utilisateur qui sont la sortie de la culture invariante (c'est-à-dire `` dans '' la culture invariante), vous faites quelque chose ne va pas et ne comprend pas la culture invariante.
mlhDev
3

La culture invariante est insensible à la culture; il est associé à la langue anglaise mais pas à un pays / une région.

CultureInfo.InvariantCulture récupère une instance de la culture invariante. Il peut être utilisé dans presque toutes les méthodes de l'espace de noms System.Globalization qui nécessitent une culture.

Les objets renvoyés par des propriétés telles que CompareInfo, DateTimeFormat et NumberFormat reflètent également la comparaison de chaînes et les conventions de mise en forme de la culture invariante. La propriété InvariantCulture est pratique lorsque vous souhaitez afficher des données persistantes dans un format indépendant de la culture .

Par exemple, si vous souhaitez afficher un nombre ou une date / heure dans un format spécifique indépendant de la culture actuelle de l'application, vous pouvez utiliser CultureInfo.InvariantCulture .

CharithJ
la source
0

C'est une langue anglaise universelle simple non spécifique à la région et d'autres informations connexes. C'est comme le langage du langage de programmation lui-même. Vous pouvez vous y fier pour mettre en place un calendrier universel; dans une situation où vous devez générer des noms de contrôleurs, des URL, des noms de délégués ... etc. et ont besoin que les choses agissent naturellement et universellement parmi tous les utilisateurs.

Shadi Namrouti
la source