Partager via


CA1304 : Spécifier CultureInfo

TypeName

SpecifyCultureInfo

CheckId

CA1304

Catégorie

Microsoft.Globalization

Modification avec rupture

Modification sans rupture

Cause

Une méthode ou un constructeur appelle un membre qui présente une surcharge qui accepte un paramètre System.Globalization.CultureInfo, et la méthode ou le constructeur n'appelle pas la surcharge qui accepte le paramètre CultureInfo. Cette règle ignore les appels aux méthodes suivantes :

Description de la règle

Lorsqu'un objet CultureInfo ou System.IFormatProvider n'est pas fourni, la valeur par défaut fournie par le membre surchargé peut ne pas avoir l'effet escompté dans toutes les configurations régionales. De plus, les membres du .NET Framework choisissent la culture par défaut et la mise en forme en fonction d'hypothèses qui peuvent se révéler incorrectes pour votre code. Pour garantir le fonctionnement du code attendu dans vos scénarios, vous devez fournir des informations spécifiques à la culture, conformément aux indications suivantes :

  • Si la valeur est présentée à l'utilisateur, utilisez la culture actuelle. Consultez CultureInfo.CurrentCulture.

  • Si la valeur est stockée et fait l'objet d'accès par voie logicielle, c'est-à-dire si elle est rendue persistante dans un fichier ou une base de données, utilisez la culture indifférente. Consultez CultureInfo.InvariantCulture.

  • Si vous ne connaissez pas la destination de la valeur, faites en sorte que le consommateur ou le fournisseur de données spécifie la culture.

Remarquez que CultureInfo.CurrentUICulture est utilisé uniquement pour récupérer des ressources localisées à l'aide d'une instance de la classe System.Resources.ResourceManager.

Même si le comportement par défaut du membre surchargé est adapté à vos besoins, mieux vaut appeler explicitement la surcharge spécifique à la culture afin que votre code soit automatiquement documenté et plus facile à gérer.

Comment corriger les violations

Pour corriger une violation de cette règle, utilisez la surcharge qui accepte un CultureInfo ou un IFormatProvider, puis spécifiez l'argument d'après les indications répertoriées précédemment.

Quand supprimer les avertissements

Il est possible de supprimer sans risque un avertissement de cette règle lorsqu'il est certain que la culture/le fournisseur de format par défaut constitue le choix correct et lorsque la facilité de maintenance du code ne constitue pas une priorité de développement importante.

Exemple

Dans l'exemple suivant, BadMethod provoque deux violations de cette règle. GoodMethod corrige la première violation en passant la culture dite indifférente à System.String.Compare, et corrige la deuxième violation en passant la culture actuelle à ToLower parce que string3 est visible par l'utilisateur.

using System;
using System.Globalization;

namespace GlobalizationLibrary
{
    public class CultureInfoTest
    {
        public void BadMethod(String string1, String string2, String string3)
        {
            if(string.Compare(string1, string2, false) == 0)
            {
                Console.WriteLine(string3.ToLower());
            }
        }

        public void GoodMethod(String string1, String string2, String string3)
        {
            if(string.Compare(string1, string2, false, 
                              CultureInfo.InvariantCulture) == 0)
            {
                Console.WriteLine(string3.ToLower(CultureInfo.CurrentCulture));
            }
        }
    }
}

L'exemple suivant illustre l'effet de la culture actuelle sur le IFormatProvider par défaut sélectionné par le type DateTime.

using System;
using System.Globalization;
using System.Threading;

namespace GlobalLibGlobalLibrary
{
    public class IFormatProviderTest
    {
        public static void Main()
        {
            string dt = "6/4/1900 12:15:12";

            // The default behavior of DateTime.Parse is to use
            // the current culture.

            // Violates rule: SpecifyIFormatProvider.
            DateTime myDateTime = DateTime.Parse(dt);
            Console.WriteLine(myDateTime);

            // Change the current culture to the French culture,
            // and parsing the same string yields a different value.

            Thread.CurrentThread.CurrentCulture = new CultureInfo("Fr-fr", true);
            myDateTime = DateTime.Parse(dt);

            Console.WriteLine(myDateTime);
        }
    }
}

Cet exemple génère la sortie suivante :

  

Règles connexes

CA1305 : Spécifier IFormatProvider

Voir aussi

Concepts

Utilisation de la classe CultureInfo