CA1304 : Spécifier CultureInfo
Propriété | Value |
---|---|
Identificateur de la règle | CA1304 |
Titre | Spécifier CultureInfo |
Catégorie | Globalisation |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | Non |
Cause
Une méthode ou un constructeur appelle un membre présentant une surcharge qui accepte un paramètre System.Globalization.CultureInfo, et la méthode ou le constructeur n’appelle pas la surcharge qui prend le paramètre CultureInfo. Cette règle ignore les appels aux méthodes suivantes :
Vous pouvez également configurer d’autres symboles à exclure par cette règle.
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é selon les différents paramètres régionaux. En outre, les membres .NET choisissent la culture et la mise en forme par défaut en fonction des hypothèses susceptibles de ne pas être correctes pour votre code. Pour vous assurer que le code fonctionne comme prévu pour vos scénarios, vous devez fournir des informations spécifiques à la culture en fonction des instructions suivantes :
Si la valeur est affichée pour l’utilisateur, utilisez la culture actuelle. Consultez CultureInfo.CurrentCulture.
Si la valeur est stockée et accessible par le logiciel, c’est-à-dire conservée dans un fichier ou une base de données, utilisez la culture invariante. 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.
Même si le comportement par défaut du membre surchargé convient à vos besoins, il est préférable d’appeler explicitement la surcharge spécifique à la culture afin que votre code soit autodocumenté et plus facilement géré.
Notes
CultureInfo.CurrentUICulture est utilisé uniquement pour récupérer des ressources localisées à l’aide d’une instance de la classe System.Resources.ResourceManager.
Comment corriger les violations
Pour corriger une violation de cette règle, utilisez la surcharge qui prend un argument CultureInfo.
Quand supprimer les avertissements
Il est prudent de supprimer un avertissement de cette règle lorsqu’il est certain que la culture par défaut est le bon choix et que la maintenance du code n’est pas une priorité de développement importante.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA1304
// The code that's violating the rule is on this line.
#pragma warning restore CA1304
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none
dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA1304.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Configurer le code à analyser
Utilisez l’option suivante pour configurer les parties de votre codebase sur lesquelles exécuter cette règle.
Vous pouvez configurer ces options pour cette règle uniquement, pour toutes les règles auxquelles elles s’appliquent ou pour toutes les règles de cette catégorie (Globalisation) auxquelles elles s’appliquent. Pour plus d’informations, consultez Options de configuration des règles de qualité du code.
Exclure des symboles spécifiques
Vous pouvez exclure de l’analyse des symboles spécifiques, comme des types et des méthodes. Par exemple, pour spécifier que la règle ne doit pas s’exécuter sur du code dans des types nommés MyType
, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Formats de nom de symbole autorisés dans la valeur d’option (séparés par |
) :
- Nom du symbole uniquement (inclut tous les symboles avec le nom, quel que soit le type ou l’espace de noms qui les contient).
- Noms qualifiés complets au format d’ID de documentation du symbole. Chaque nom de symbole nécessite un préfixe de type symbole, comme
M:
pour les méthodes,T:
pour les types etN:
pour les espaces de noms. .ctor
pour les constructeurs et.cctor
pour les constructeurs statiques.
Exemples :
Valeur d’option | Récapitulatif |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Correspond à tous les symboles nommés MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Correspond à tous les symboles nommés MyType1 ou MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Correspond à une méthode MyMethod spécifique avec la signature complète spécifiée. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Correspond à des méthodes MyMethod1 et MyMethod2 spécifiques avec la signature complète spécifiée. |
Exclure des types spécifiques et leurs types dérivés
Vous pouvez exclure de l’analyse des types spécifiques et leurs types dérivés. Par exemple, pour spécifier que la règle ne doit s’exécuter sur aucune méthode dans des types nommés MyType
et leurs types dérivés, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Formats de nom de symbole autorisés dans la valeur d’option (séparés par |
) :
- Nom du type uniquement (inclut tous les types avec le nom, quel que soit le type ou l’espace de noms qui les contient).
- Noms qualifiés complets au format d’ID de documentation du symbole, avec un préfixe
T:
facultatif.
Exemples :
Valeur d’option | Récapitulatif |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Correspond à tous les types nommés MyType et à tous leurs types dérivés. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Correspond à tous les types nommés MyType1 ou MyType2 , et à tous leurs types dérivés. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Correspond à un type MyType spécifique avec un nom complet donné et tous ses types dérivés. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Correspond à des types MyType1 ou MyType2 spécifiques avec leur nom complet respectif et tous leurs types dérivés. |
Exemple montrant comment corriger les violations
Dans l’exemple suivant, BadMethod
provoque deux violations de cette règle. GoodMethod
corrige la première violation en passant la culture invariante à String.Compare, et corrige la deuxième violation en passant la culture actuelle à String.ToLower, car string3
est affiché pour l’utilisateur.
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));
}
}
}
Exemple montrant la sortie mise en forme
L’exemple suivant montre l’effet de la culture actuelle sur la valeur par défaut IFormatProvider sélectionnée par le type DateTime.
public class IFormatProviderTest
{
public static void Main1304()
{
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 produit la sortie suivante :
6/4/1900 12:15:12 PM
06/04/1900 12:15:12