Condividi tramite


Specificare CultureInfo

Aggiornamento: novembre 2007

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 internazionali. 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 il funzionamento del codice 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. Per informazioni, 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. Per informazioni, vedere CultureInfo.InvariantCulture.

  • Se non si conosce la destinazione del valore, richiedere al consumer di dati o al provider 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.

Correzione di 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

Nell'esempio riportato di seguito, 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 il seguente output:

6/4/1900 12:15:12 PM
06/04/1900 12:15:12

Regole correlate

Specificare IFormatProvider

Vedere anche

Concetti

Uso della classe CultureInfo