CA1304: Specificare CultureInfo
TypeName |
SpecifyCultureInfo |
CheckId |
CA1304 |
Category |
Microsoft.Globalization |
Breaking Change |
Non sostanziale |
Causa
Un metodo o un costruttore chiama un membro che presenta un overload che accetta un parametro System.Globalization.CultureInfo e il metodo o il costruttore non chiama l'overload che accetta il parametro CultureInfo.Questa regola ignora le chiamate ai seguenti metodi:
Descrizione della regola
Quando non viene fornito un oggetto CultureInfo o System.IFormatProvider, il valore predefinito fornito dal membro di overload potrebbe non produrre l'effetto desiderato su tutte le impostazioni locali.Inoltre, i membri .NET Framework scelgono le impostazioni cultura e la formattazione predefinite in base a supposizioni che potrebbero non essere corrette per il codice.Per assicurare che il codice funzioni come previsto negli scenari correnti, è necessario fornire informazioni specifiche delle impostazioni cultura in base alle seguenti linee guida:
Se il valore verrà visualizzato dall'utente, utilizzare le impostazioni cultura correnti.Vedere CultureInfo.CurrentCulture.
Se il software archivierà e accederà al valore, ovvero il valore verrà mantenuto in un file o in un database, utilizzare le impostazioni cultura invarianti.Vedere CultureInfo.InvariantCulture.
Se non si conosce la destinazione del valore, richiedere al provider o al consumer di dati di specificare le impostazioni cultura.
Si noti che la proprietà CultureInfo.CurrentUICulture viene utilizzata solo per recuperare le risorse localizzate utilizzando un'istanza della classe System.Resources.ResourceManager.
Anche se il comportamento predefinito del membro di overload è appropriato alle esigenze, è consigliabile chiamare in modo esplicito l'overload specifico delle impostazioni cultura affinché il codice risulti autodocumentato e di più agevole manutenzione.
Come correggere le violazioni
Per correggere una violazione di questa regola, utilizzare l'overload che accetta un oggetto CultureInfo o IFormatProvider e specificare l'argomento in base alle linee guida elencate in precedenza.
Esclusione di avvisi
L'esclusione di un avviso da questa regola è sicura se si è certi che il provider predefinito delle impostazioni cultura o del formato sia la scelta corretta e quando la gestibilità del codice non è una priorità importante per lo sviluppo.
Esempio
Nel seguente esempio, BadMethod causa due violazioni di questa regola.GoodMethod corregge la prima violazione passando le impostazioni cultura invarianti a System.String.Compare e corregge la seconda violazione passando le impostazioni cultura correnti a ToLower poiché string3 viene visualizzato dall'utente.
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));
}
}
}
}
Nell'esempio riportato di seguito viene illustrato l'effetto delle impostazioni cultura correnti sull'oggetto IFormatProvider predefinito selezionato dal tipo 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);
}
}
}
Questo esempio produce l'output che segue.
Regole correlate
CA1305: Specificare IFormatProvider