Comparaisons de chaînes en C #: Différence entre CurrentCultureIgnoreCase et InvariantCultureIgnoreCase
-
03-07-2019 - |
Question
Lors de la comparaison de chaînes en C #, quelle est la différence entre une
string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);
et
string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase);
... et est-il important d'inclure ce paramètre supplémentaire, de toute façon?
La solution
Microsoft fournit des indications précises sur l'utilisation de la propriété InvariantCulture
:
MSDN: CultureInfo.InvariantCulture, propriété
... une application doit utiliser le culture invariante uniquement pour les processus qui nécessitent une culture indépendante résultats, tels que le formatage et l'analyse des données qui est persisté à un fichier. Dans d'autres cas, il produit des résultats qui pourraient être linguistiquement incorrect ou culturellement inapproprié.
Considérations sur la sécurité
Si une décision de sécurité sera prise basé sur le résultat d'une chaîne comparaison ou changement de cas, votre l'application doit utiliser un ordinale comparaison qui ignore le cas à la place d'utiliser InvariantCulture. [...]
Opérations sur les chaînes
Si votre application doit effectuer une opération de chaîne sensible à la culture qui n'est pas affecté par la valeur de CurrentCulture, il faut utiliser une méthode qui accepte un paramètre CultureInfo. [...]
Données persistantes
La propriété InvariantCulture est utile pour stocker des données qui ne seront pas être affiché directement aux utilisateurs. Stockage des données dans un environnement indépendant de la culture format garantit un format connu qui ne change pas. Quand les utilisateurs de différentes cultures accèdent aux données, il peut être formaté de manière appropriée sur un utilisateur spécifique. [...]
Autres conseils
Les autres publications ont donné de bons conseils, mais j’ai pensé qu’il serait peut-être intéressant de montrer un exemple montrant en quoi cela fait vraiment une différence:
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));
}
}
(Il y a sans aucun doute de nombreux autres cas - ce n’était que le premier auquel j’ai pensé.)