Comparaisons de chaînes en C #: Différence entre CurrentCultureIgnoreCase et InvariantCultureIgnoreCase

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

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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top