Spécifier IFormatProvider
Mise à jour : novembre 2007
TypeName |
SpecifyIFormatProvider |
CheckId |
CA1305 |
Catégorie |
Microsoft.Globalization |
Modification avec rupture |
Modification sans rupture |
Cause
Une méthode ou un constructeur appelle un ou plusieurs membres présentant des surcharges qui acceptent un paramètre System.IFormatProvider, et la méthode ou le constructeur n'appelle pas la surcharge qui accepte le paramètre IFormatProvider. Cette règle ignore les appels aux méthodes du .NET Framework documentées comme ignorant le paramètre IFormatProvider ainsi qu'aux méthodes suivantes :
Description de la règle
Lorsqu'un objet System.Globalization.CultureInfo ou 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 indifférente à Compare, puis corrige la seconde en passant la culture actuelle à ToLower car string3 est présenté à 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 produit la sortie suivante :
6/4/1900 12:15:12 PM
06/04/1900 12:15:12