Condividi tramite


CA1305: Specificare IFormatProvider

TypeName

SpecifyIFormatProvider

CheckId

CA1305

Category

Microsoft.Globalization

Breaking Change

Non sostanziale

Causa

Un metodo o un costruttore chiama uno o più membri con overload che accettano un parametro System.IFormatProvider e tale metodo o costruttore non chiama l'overload che accetta il parametro IFormatProvider. Questa regola ignora le chiamate ai metodi .NET Framework di cui è noto il fatto che ignorano il parametro IFormatProvider oltre ai seguenti metodi:

Descrizione della regola

Quando non viene fornito un oggetto System.Globalization.CultureInfo o 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 garantire 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 sarà il software ad archiviare e accedere al valore, ossia se il valore verrà mantenuto in un file o 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 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

CA1304: Specificare CultureInfo

Vedere anche

Concetti

Uso della classe CultureInfo