Classe CultureInfo

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

La CultureInfo classe fornisce informazioni specifiche delle impostazioni cultura, ad esempio lingua, sottolanguage, paese/area geografica, calendario e convenzioni associate a impostazioni cultura specifiche. Questa classe fornisce anche l'accesso a istanze specifiche delle impostazioni cultura degli DateTimeFormatInfooggetti , NumberFormatInfoCompareInfo, e TextInfo . Questi oggetti contengono le informazioni necessarie per operazioni specifiche delle impostazioni cultura, ad esempio maiuscole e minuscole, date e numeri di formattazione e confronto di stringhe. La CultureInfo classe viene usata direttamente o indirettamente dalle classi che formattano, analizzano o modificano i dati specifici delle impostazioni cultura, ad esempio String, DateTimeDateTimeOffset, e i tipi numerici.

Nomi e identificatori delle impostazioni cultura

La CultureInfo classe specifica un nome univoco per ogni lingua, in base a RFC 4646. Il nome è una combinazione di un codice delle impostazioni cultura ISO 639 a due lettere o a tre lettere minuscole associato a una lingua e a un codice di sottoculture in maiuscolo ISO 3166 associato a un paese o a un'area geografica. Inoltre, per le app in esecuzione in Windows 10 o versioni successive, sono supportati i nomi delle impostazioni cultura che corrispondono ai tag di lingua BCP-47 validi.

Nota

Quando un nome delle impostazioni cultura viene passato a un costruttore di classe o a un metodo come CreateSpecificCulture o CultureInfo, il relativo caso non è significativo.

Il formato per il nome delle impostazioni cultura basato su RFC 4646 è languagecode2-country/regioncode2, dove languagecode2 è il codice di lingua a due lettere e country/regioncode2 è il codice della sottoculture a due lettere. Esempi includono ja-JP per il giapponese (Giappone) e en-US per l'inglese (Stati Uniti). Nei casi in cui non è disponibile un codice linguistico a due lettere, viene usato un codice di tre lettere definito in ISO 639-3.

Alcuni nomi delle impostazioni cultura specificano anche uno script ISO 15924. Ad esempio, Cyrl specifica lo script cirillico e Latn specifica lo script latino. Un nome delle impostazioni cultura che include uno script usa il modello languagecode2country/regioncode2-scripttag-. Un esempio di questo tipo di nome cultura è uz-Cyrl-UZ per Uzbeko (cirillico, Uzbekistan). Nei sistemi operativi Windows prima di Windows Vista, un nome delle impostazioni cultura che include uno script usa il modello languagecode2--country/regioncode2scripttag, ad esempio per uz-UZ-Cyrl Uzbeko (cirillico, Uzbekistan).

Le impostazioni cultura neutre vengono specificate solo dal codice lingua minuscolo a due lettere. Ad esempio, fr specifica le impostazioni cultura neutre per il francese e de specifica le impostazioni cultura neutre per il tedesco.

Nota

Esistono due nomi di impostazioni cultura che contraddicono questa regola. Le impostazioni cultura cinesi (semplificate), denominate zh-Hanse cinesi (tradizionali), denominate zh-Hant, sono impostazioni cultura neutre. I nomi delle impostazioni cultura rappresentano lo standard corrente e devono essere usati a meno che non si disponga di un motivo per usare i nomi zh-CHS precedenti e zh-CHT.

Un identificatore delle impostazioni cultura è un'abbreviazione numerica internazionale standard e include i componenti necessari per identificare in modo univoco una delle impostazioni cultura installate. L'applicazione può usare identificatori di impostazioni cultura predefiniti o definire identificatori personalizzati.

Alcuni nomi e identificatori predefiniti delle impostazioni cultura vengono usati da questa e da altre classi nello spazio dei System.Globalization nomi . Per informazioni dettagliate sulle impostazioni cultura per i sistemi Windows, vedere la colonna Tag lingua nell'elenco dei nomi di lingua/area geografica supportati da Windows. I nomi delle impostazioni cultura seguono lo standard definito da BCP 47.

I nomi e gli identificatori delle impostazioni cultura rappresentano solo un subset di impostazioni cultura che possono essere trovati in un computer specifico. Le versioni di Windows o i Service Pack possono modificare le impostazioni cultura disponibili. Le applicazioni possono aggiungere impostazioni cultura personalizzate usando la CultureAndRegionInfoBuilder classe . Gli utenti possono aggiungere impostazioni cultura personalizzate usando lo strumento Microsoft Locale Builder . Microsoft Locale Builder viene scritto in codice gestito usando la CultureAndRegionInfoBuilder classe .

Diversi nomi distinti sono strettamente associati a impostazioni cultura, in particolare i nomi associati ai membri di classe seguenti:

Impostazioni cultura invarianti, neutre e specifiche

Le impostazioni cultura sono in genere raggruppate in tre set: culture invarianti, culture neutre e impostazioni cultura specifiche.

Una cultura invariante è indipendente dalle impostazioni cultura. L'applicazione specifica le impostazioni cultura invarianti in base al nome usando una stringa vuota ("") o il relativo identificatore. InvariantCulture definisce un'istanza delle impostazioni cultura invarianti. È associato alla lingua inglese, ma non a nessun paese o area geografica. Viene usato in quasi tutti i metodi nello spazio dei Globalization nomi che richiede impostazioni cultura.

Le impostazioni cultura neutre sono impostazioni cultura associate a una lingua ma non a un paese/area geografica. Una cultura specifica è una cultura associata a una lingua e a un paese/area geografica. Ad esempio, fr è il nome neutro per le impostazioni cultura francesi ed fr-FR è il nome delle impostazioni cultura francese (Francia) specifiche. Si noti che anche il cinese (semplificato) e il cinese (tradizionale) sono considerati culture neutre.

La creazione di un'istanza di una CompareInfo classe per impostazioni cultura neutre non è consigliata perché i dati contenuti sono arbitrari. Per visualizzare e ordinare i dati, specificare sia la lingua che l'area geografica. Inoltre, la Name proprietà di un CompareInfo oggetto creato per impostazioni cultura neutre restituisce solo il paese e non include l'area.

Le impostazioni cultura definite hanno una gerarchia in cui l'elemento padre di impostazioni cultura specifiche è una cultura neutra e l'elemento padre di impostazioni cultura neutre è la cultura invariante. La Parent proprietà contiene le impostazioni cultura neutre associate a impostazioni cultura specifiche. Le impostazioni cultura personalizzate devono definire la Parent proprietà in conformità a questo modello.

Se le risorse per impostazioni cultura specifiche non sono disponibili nel sistema operativo, vengono usate le risorse per le impostazioni cultura neutre associate. Se le risorse per le impostazioni cultura neutre non sono disponibili, vengono usate le risorse incorporate nell'assembly principale. Per altre informazioni sul processo di fallback delle risorse, vedere Creazione di pacchetti e distribuzione di risorse.

L'elenco delle impostazioni locali nell'API di Windows è leggermente diverso dall'elenco delle impostazioni cultura supportate da .NET. Se è necessaria l'interoperabilità con Windows, ad esempio tramite il meccanismo p/invoke, l'applicazione deve usare impostazioni cultura specifiche definite per il sistema operativo. L'uso delle impostazioni cultura specifiche garantisce la coerenza con le impostazioni locali di Windows equivalenti, identificate con un identificatore delle impostazioni locali uguale a LCID.

Un DateTimeFormatInfo oggetto o NumberFormatInfo può essere creato solo per le impostazioni cultura invarianti o per impostazioni cultura specifiche, non per le impostazioni cultura neutre.

Se DateTimeFormatInfo.Calendar è ma TaiwanCalendarThread.CurrentCulture non è impostato su zh-TW, DateTimeFormatInfo.NativeCalendarName, DateTimeFormatInfo.GetEraNamee DateTimeFormatInfo.GetAbbreviatedEraName restituisce una stringa vuota ("").

Impostazioni cultura personalizzate

In Windows è possibile creare impostazioni locali personalizzate. Per altre informazioni, vedere Impostazioni locali personalizzate.

CultureInfo e dati culturali

.NET deriva i dati culturali da una delle diverse origini, a seconda dell'implementazione, della piattaforma e della versione:

  • In tutte le versioni di .NET (Core) in esecuzione su piattaforme Unix o Windows 10 e versioni successive, i dati culturali vengono forniti dalla libreria International Components for Unicode (ICU). La versione specifica della libreria di ICU dipende dal singolo sistema operativo.
  • In tutte le versioni di .NET (Core) in esecuzione in Windows 9 e versioni precedenti, i dati culturali vengono forniti dal sistema operativo Windows.
  • In .NET Framework 4 e versioni successive i dati culturali vengono forniti dal sistema operativo Windows.

Per questo motivo, le impostazioni cultura disponibili in una determinata implementazione, piattaforma o versione di .NET potrebbero non essere disponibili in un'implementazione, una piattaforma o una versione .NET diversa.

Alcuni CultureInfo oggetti variano a seconda della piattaforma sottostante. In particolare, zh-CNo cinese (semplificato, cina) e zh-TW, o cinese (tradizionale, Taiwan), sono impostazioni cultura disponibili nei sistemi Windows, ma sono impostazioni cultura con alias nei sistemi Unix. "zh-CN" è un alias per le impostazioni cultura "zh-Hans-CN" e "zh-TW" è un alias per le impostazioni cultura "zh-Hant-TW". Le impostazioni cultura con alias non vengono restituite dalle chiamate al GetCultures metodo e possono avere valori di proprietà diversi, incluse impostazioni cultura diverse Parent , rispetto alle rispettive controparti di Windows. Per le zh-CN impostazioni cultura e zh-TW , queste differenze includono quanto segue:

  • Nei sistemi Windows, la cultura padre della cultura "zh-CN" è "zh-Hans" e la cultura padre della cultura "zh-TW" è "zh-Hant". La cultura padre di entrambe queste culture è "zh". Nei sistemi Unix i genitori di entrambe le impostazioni cultura sono "zh". Ciò significa che, se non si forniscono risorse specifiche delle impostazioni cultura per le impostazioni cultura "zh-CN" o "zh-TW", ma si forniscono risorse per le impostazioni cultura neutre "zh-Hans" o "zh-Hant", l'applicazione caricherà le risorse per le impostazioni cultura neutre in Windows ma non in Unix. Nei sistemi Unix è necessario impostare in modo esplicito il thread CurrentUICulture su "zh-Hans" o "zh-Hant".

  • Nei sistemi Windows, chiamando CultureInfo.Equals su un'istanza che rappresenta le impostazioni cultura "zh-CN" e passandola un'istanza "zh-Hans-CN" restituisce true. Nei sistemi Unix la chiamata al metodo restituisce false. Questo comportamento si applica anche alla chiamata Equals a un'istanza "zh-TW" CultureInfo e al passaggio di un'istanza "zh-Hant-Tw".

Dati delle impostazioni cultura dinamiche

Ad eccezione delle impostazioni cultura invarianti, i dati delle impostazioni cultura sono dinamici. Questo vale anche per le impostazioni cultura predefinite. Ad esempio, i paesi o le aree geografiche adottano nuove valute, modificano l'ortografia delle parole o modificano il calendario preferito e le definizioni delle impostazioni cultura cambiano per tenere traccia di questo. Le impostazioni cultura personalizzate sono soggette a modifiche senza preavviso e le impostazioni cultura specifiche potrebbero essere sostituite da impostazioni cultura di sostituzione personalizzate. Inoltre, come illustrato di seguito, un singolo utente può sostituire le preferenze culturali. Le applicazioni devono sempre ottenere i dati delle impostazioni cultura in fase di esecuzione.

Attenzione

Quando si salvano dati, l'applicazione deve usare le impostazioni cultura invarianti, un formato binario o un formato specifico indipendente dalle impostazioni cultura. I dati salvati in base ai valori correnti associati a impostazioni cultura specifiche, diverse dalle impostazioni cultura invarianti, potrebbero diventare illeggibili o cambiare significato se tali impostazioni cultura cambiano.

Impostazioni cultura correnti e impostazioni cultura correnti dell'interfaccia utente

Ogni thread in un'applicazione .NET ha impostazioni cultura correnti e impostazioni cultura dell'interfaccia utente correnti. Le impostazioni cultura correnti determinano le convenzioni di formattazione per date, ore, numeri e valori di valuta, l'ordinamento del testo, le convenzioni di maiuscole e minuscole e i modi in cui vengono confrontate le stringhe. Le impostazioni cultura dell'interfaccia utente correnti vengono usate per recuperare risorse specifiche delle impostazioni cultura in fase di esecuzione.

Nota

Per informazioni sulla modalità di determinazione delle impostazioni cultura correnti e correnti dell'interfaccia utente in base al thread, vedere la sezione Impostazioni cultura e thread . Per informazioni su come vengono determinate le impostazioni cultura correnti e correnti dell'interfaccia utente sui thread in esecuzione in un nuovo dominio applicazione e sui thread che superano i limiti del dominio applicazione, vedere la sezione Impostazioni cultura e domini applicazione. Per informazioni sulla modalità di determinazione delle impostazioni cultura correnti e correnti dell'interfaccia utente sui thread che eseguono operazioni asincrone basate su attività, vedere la sezione Impostazioni cultura e operazioni asincrone basate su attività.

Per informazioni più dettagliate sulle impostazioni cultura correnti, vedere la CultureInfo.CurrentCulture proprietà . Per informazioni più dettagliate sulle impostazioni cultura correnti dell'interfaccia utente, vedere l'argomento relativo alla CultureInfo.CurrentUICulture proprietà.

Recuperare le impostazioni cultura correnti e correnti dell'interfaccia utente

È possibile ottenere un CultureInfo oggetto che rappresenta le impostazioni cultura correnti in uno dei due modi seguenti:

Nell'esempio seguente vengono recuperati entrambi i valori delle proprietà, confrontati per indicare che sono uguali e viene visualizzato il nome delle impostazioni cultura correnti.

using System;
using System.Globalization;
using System.Threading;

public class CurrentCultureEx
{
    public static void Main()
    {
        CultureInfo culture1 = CultureInfo.CurrentCulture;
        CultureInfo culture2 = Thread.CurrentThread.CurrentCulture;
        Console.WriteLine("The current culture is {0}", culture1.Name);
        Console.WriteLine("The two CultureInfo objects are equal: {0}",
                          culture1 == culture2);
    }
}
// The example displays output like the following:
//     The current culture is en-US
//     The two CultureInfo objects are equal: True

È possibile ottenere un CultureInfo oggetto che rappresenta le impostazioni cultura correnti dell'interfaccia utente in uno dei due modi seguenti:

L'esempio seguente recupera entrambi i valori delle proprietà, li confronta per mostrare che sono uguali e visualizza il nome delle impostazioni cultura dell'interfaccia utente correnti.

using System;
using System.Globalization;
using System.Threading;

public class CurrentUIEx
{
    public static void Main()
    {
        CultureInfo uiCulture1 = CultureInfo.CurrentUICulture;
        CultureInfo uiCulture2 = Thread.CurrentThread.CurrentUICulture;
        Console.WriteLine("The current UI culture is {0}", uiCulture1.Name);
        Console.WriteLine("The two CultureInfo objects are equal: {0}",
                          uiCulture1 == uiCulture2);
    }
}
// The example displays output like the following:
//     The current UI culture is en-US
//     The two CultureInfo objects are equal: True

Impostare le impostazioni cultura correnti e correnti dell'interfaccia utente

Per modificare le impostazioni cultura e le impostazioni cultura dell'interfaccia utente di un thread, eseguire le operazioni seguenti:

  1. Creare un'istanza di un CultureInfo oggetto che rappresenta le impostazioni cultura chiamando un CultureInfo costruttore di classe e passandolo il nome delle impostazioni cultura. Il CultureInfo(String) costruttore crea un'istanza di un CultureInfo oggetto che riflette l'override dell'utente se le nuove impostazioni cultura corrispondono alle impostazioni cultura di Windows correnti. Il CultureInfo(String, Boolean) costruttore consente di specificare se l'oggetto appena creato CultureInfo riflette le sostituzioni dell'utente se le nuove impostazioni cultura corrispondono alle impostazioni cultura correnti di Windows.

  2. Assegnare l'oggetto CultureInfo alla CultureInfo.CurrentCulture proprietà o CultureInfo.CurrentUICulture in .NET Core e .NET Framework 4.6 e versioni successive.

Nell'esempio seguente vengono recuperate le impostazioni cultura correnti. Se è diverso dalla cultura francese (Francia), cambia le impostazioni cultura correnti in francese (Francia). In caso contrario, le impostazioni cultura correnti vengono modificate in francese (Lussemburgo).

using System;
using System.Globalization;

public class ChangeEx1
{
    public static void Main()
    {
        CultureInfo current = CultureInfo.CurrentCulture;
        Console.WriteLine("The current culture is {0}", current.Name);
        CultureInfo newCulture;
        if (current.Name.Equals("fr-FR"))
            newCulture = new CultureInfo("fr-LU");
        else
            newCulture = new CultureInfo("fr-FR");

        CultureInfo.CurrentCulture = newCulture;
        Console.WriteLine("The current culture is now {0}",
                          CultureInfo.CurrentCulture.Name);
    }
}
// The example displays output like the following:
//     The current culture is en-US
//     The current culture is now fr-FR

Nell'esempio seguente vengono recuperate le impostazioni cultura correnti. Se è qualcosa di diverso dalla cultura slovena (Slovenia), cambia la cultura attuale in sloveno (Slovenia). In caso contrario, cambia la cultura corrente in Croato (Croazia).

using System;
using System.Globalization;

public class ChangeUICultureEx
{
    public static void Main()
    {
        CultureInfo current = CultureInfo.CurrentUICulture;
        Console.WriteLine("The current UI culture is {0}", current.Name);
        CultureInfo newUICulture;
        if (current.Name.Equals("sl-SI"))
            newUICulture = new CultureInfo("hr-HR");
        else
            newUICulture = new CultureInfo("sl-SI");

        CultureInfo.CurrentUICulture = newUICulture;
        Console.WriteLine("The current UI culture is now {0}",
                          CultureInfo.CurrentUICulture.Name);
    }
}
// The example displays output like the following:
//     The current UI culture is en-US
//     The current UI culture is now sl-SI

Ottenere tutte le impostazioni cultura

È possibile recuperare una matrice di categorie specifiche di impostazioni cultura o di tutte le impostazioni cultura disponibili nel computer locale chiamando il GetCultures metodo . Ad esempio, è possibile recuperare impostazioni cultura personalizzate, impostazioni cultura specifiche o impostazioni cultura neutre da sole o in combinazione.

Nell'esempio seguente viene chiamato il GetCultures metodo due volte, prima con il System.Globalization.CultureTypes membro di enumerazione per recuperare tutte le impostazioni cultura personalizzate e quindi con il System.Globalization.CultureTypes membro di enumerazione per recuperare tutte le impostazioni cultura di sostituzione.

using System;
using System.Globalization;

public class GetCulturesEx
{
    public static void Main()
    {
        // Get all custom cultures.
        CultureInfo[] custom = CultureInfo.GetCultures(CultureTypes.UserCustomCulture);
        if (custom.Length == 0)
        {
            Console.WriteLine("There are no user-defined custom cultures.");
        }
        else
        {
            Console.WriteLine("Custom cultures:");
            foreach (var culture in custom)
                Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName);
        }
        Console.WriteLine();

        // Get all replacement cultures.
        CultureInfo[] replacements = CultureInfo.GetCultures(CultureTypes.ReplacementCultures);
        if (replacements.Length == 0)
        {
            Console.WriteLine("There are no replacement cultures.");
        }
        else
        {
            Console.WriteLine("Replacement cultures:");
            foreach (var culture in replacements)
                Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName);
        }
        Console.WriteLine();
    }
}
// The example displays output like the following:
//     Custom cultures:
//        x-en-US-sample -- English (United States)
//        fj-FJ -- Boumaa Fijian (Viti)
//
//     There are no replacement cultures.

Impostazioni cultura e thread

Quando viene avviato un nuovo thread dell'applicazione, le impostazioni cultura correnti e le impostazioni cultura correnti dell'interfaccia utente vengono definite dalle impostazioni cultura di sistema correnti e non dalle impostazioni cultura del thread corrente. Nell'esempio che segue viene illustrata la differenza. Imposta le impostazioni cultura correnti e le impostazioni cultura correnti dell'interfaccia utente di un thread applicazione sulle impostazioni cultura francese (Francia) (fr-FR). Se le impostazioni cultura correnti sono già fr-FR, l'esempio lo imposta sulle impostazioni cultura inglese (Stati Uniti) (en-US). Visualizza tre numeri casuali come valori di valuta e quindi crea un nuovo thread, che a sua volta visualizza tre numeri casuali più come valori di valuta. Tuttavia, come mostra l'output dell'esempio, i valori di valuta visualizzati dal nuovo thread non riflettono le convenzioni di formattazione delle impostazioni cultura francese (Francia), a differenza dell'output del thread applicazione principale.

using System;
using System.Globalization;
using System.Threading;

public class DefaultThreadEx
{
    static Random rnd = new Random();

    public static void Main()
    {
        if (Thread.CurrentThread.CurrentCulture.Name != "fr-FR")
        {
            // If current culture is not fr-FR, set culture to fr-FR.
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
        }
        else
        {
            // Set culture to en-US.
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");
        }
        ThreadProc();

        Thread worker = new Thread(ThreadProc);
        worker.Name = "WorkerThread";
        worker.Start();
    }

    private static void DisplayThreadInfo()
    {
        Console.WriteLine("\nCurrent Thread Name: '{0}'",
                          Thread.CurrentThread.Name);
        Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}",
                          Thread.CurrentThread.CurrentCulture.Name,
                          Thread.CurrentThread.CurrentUICulture.Name);
    }

    private static void DisplayValues()
    {
        // Create new thread and display three random numbers.
        Console.WriteLine("Some currency values:");
        for (int ctr = 0; ctr <= 3; ctr++)
            Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10);
    }

    private static void ThreadProc()
    {
        DisplayThreadInfo();
        DisplayValues();
    }
}
// The example displays output similar to the following:
//       Current Thread Name: ''
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          8,11 €
//          1,48 €
//          8,99 €
//          9,04 €
//
//       Current Thread Name: 'WorkerThread'
//       Current Thread Culture/UI Culture: en-US/en-US
//       Some currency values:
//          $6.72
//          $6.35
//          $2.90
//          $7.72

È possibile impostare le impostazioni cultura e le impostazioni cultura dell'interfaccia utente di tutti i thread in un dominio applicazione assegnando un CultureInfo oggetto che rappresenta tali DefaultThreadCurrentCulture impostazioni cultura alle proprietà e DefaultThreadCurrentUICulture . Nell'esempio seguente vengono usate queste proprietà per assicurarsi che tutti i thread nel dominio applicazione predefinito convidano le stesse impostazioni cultura.

using System;
using System.Globalization;
using System.Threading;

public class SetThreadsEx
{
    static Random rnd = new Random();

    public static void Main()
    {
        if (Thread.CurrentThread.CurrentCulture.Name != "fr-FR")
        {
            // If current culture is not fr-FR, set culture to fr-FR.
            CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
            CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("fr-FR");
        }
        else
        {
            // Set culture to en-US.
            CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
            CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");
        }
        ThreadProc();

        Thread worker = new Thread(SetThreadsEx.ThreadProc);
        worker.Name = "WorkerThread";
        worker.Start();
    }

    private static void DisplayThreadInfo()
    {
        Console.WriteLine("\nCurrent Thread Name: '{0}'",
                          Thread.CurrentThread.Name);
        Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}",
                          Thread.CurrentThread.CurrentCulture.Name,
                          Thread.CurrentThread.CurrentUICulture.Name);
    }

    private static void DisplayValues()
    {
        // Create new thread and display three random numbers.
        Console.WriteLine("Some currency values:");
        for (int ctr = 0; ctr <= 3; ctr++)
            Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10);
    }

    private static void ThreadProc()
    {
        DisplayThreadInfo();
        DisplayValues();
    }
}
// The example displays output similar to the following:
//       Current Thread Name: ''
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          6,83 €
//          3,47 €
//          6,07 €
//          1,70 €
//
//       Current Thread Name: 'WorkerThread'
//       Current Thread Culture/UI Culture: fr-FR/fr-FR
//       Some currency values:
//          9,54 €
//          9,50 €
//          0,58 €
//          6,91 €

Avviso

Anche se le DefaultThreadCurrentCulture proprietà e DefaultThreadCurrentUICulture sono membri statici, definiscono le impostazioni cultura predefinite e le impostazioni cultura predefinite dell'interfaccia utente solo per il dominio applicazione corrente al momento dell'impostazione di questi valori di proprietà. Per altre informazioni, vedere la sezione successiva, Impostazioni cultura e domini applicazione.

Quando si assegnano valori alle DefaultThreadCurrentCulture proprietà e DefaultThreadCurrentUICulture , le impostazioni cultura e le impostazioni cultura dell'interfaccia utente dei thread nel dominio applicazione cambiano anche se non sono state assegnate in modo esplicito impostazioni cultura. Tuttavia, questi thread riflettono le nuove impostazioni cultura solo durante l'esecuzione nel dominio applicazione corrente. Se questi thread vengono eseguiti in un altro dominio applicazione, le impostazioni cultura diventano le impostazioni cultura predefinite definite per tale dominio applicazione. Di conseguenza, è consigliabile impostare sempre le impostazioni cultura del thread applicazione principale e non basarsi sulle DefaultThreadCurrentCulture proprietà e DefaultThreadCurrentUICulture per modificarle.

Impostazioni cultura e domini applicazione

DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture sono proprietà statiche che definiscono in modo esplicito impostazioni cultura predefinite solo per il dominio applicazione corrente quando il valore della proprietà viene impostato o recuperato. L'esempio seguente imposta le impostazioni cultura predefinite e le impostazioni cultura predefinite dell'interfaccia utente nel dominio applicazione predefinito su Francese (Francia), quindi usa la AppDomainSetup classe e il AppDomainInitializer delegato per impostare le impostazioni cultura predefinite e le impostazioni cultura dell'interfaccia utente in un nuovo dominio applicazione su Russo (Russia). Un singolo thread esegue quindi due metodi in ogni dominio applicazione. Si noti che le impostazioni cultura e le impostazioni cultura dell'interfaccia utente del thread non vengono impostate in modo esplicito; derivano dalle impostazioni cultura predefinite e dalle impostazioni cultura dell'interfaccia utente del dominio applicazione in cui viene eseguito il thread. Si noti anche che le DefaultThreadCurrentCulture proprietà e DefaultThreadCurrentUICulture restituiscono i valori predefiniti CultureInfo del dominio applicazione corrente quando viene effettuata la chiamata al metodo.

using System;
using System.Globalization;

public class Example
{
    public static void Main()
    {
        // Set the default culture and display the current date in the current application domain.
        Info info1 = new Info();
        SetAppDomainCultures("fr-FR");

        // Create a second application domain.
        AppDomainSetup setup = new AppDomainSetup();
        setup.AppDomainInitializer = SetAppDomainCultures;
        setup.AppDomainInitializerArguments = new string[] { "ru-RU" };
        AppDomain domain = AppDomain.CreateDomain("Domain2", null, setup);
        // Create an Info object in the new application domain.
        Info info2 = (Info)domain.CreateInstanceAndUnwrap(typeof(Example).Assembly.FullName,
                                                           "Info");

        // Execute methods in the two application domains.
        info2.DisplayDate();
        info2.DisplayCultures();

        info1.DisplayDate();
        info1.DisplayCultures();
    }

    public static void SetAppDomainCultures(string[] names)
    {
        SetAppDomainCultures(names[0]);
    }

    public static void SetAppDomainCultures(string name)
    {
        try
        {
            CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture(name);
            CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture(name);
        }
        // If an exception occurs, we'll just fall back to the system default.
        catch (CultureNotFoundException)
        {
            return;
        }
        catch (ArgumentException)
        {
            return;
        }
    }
}

public class Info : MarshalByRefObject
{
    public void DisplayDate()
    {
        Console.WriteLine("Today is {0:D}", DateTime.Now);
    }

    public void DisplayCultures()
    {
        Console.WriteLine("Application domain is {0}", AppDomain.CurrentDomain.Id);
        Console.WriteLine("Default Culture: {0}", CultureInfo.DefaultThreadCurrentCulture);
        Console.WriteLine("Default UI Culture: {0}", CultureInfo.DefaultThreadCurrentUICulture);
    }
}
// The example displays the following output:
//       Today is 14 октября 2011 г.
//       Application domain is 2
//       Default Culture: ru-RU
//       Default UI Culture: ru-RU
//       Today is vendredi 14 octobre 2011
//       Application domain is 1
//       Default Culture: fr-FR
//       Default UI Culture: fr-FR

Per altre informazioni sulle impostazioni cultura e sui domini applicazione, vedere la sezione "Domini applicazione e thread" nell'argomento Domini applicazione.

Impostazioni cultura e operazioni asincrone basate su attività

Il modello di programmazione asincrona basato su attività usa Task oggetti e Task<TResult> per eseguire in modo asincrono i delegati nei thread del pool di thread. Il thread specifico in cui viene eseguita una determinata attività non è noto in anticipo, ma viene determinato solo in fase di esecuzione.

Per le app destinate a .NET Framework 4.6 o versione successiva, le impostazioni cultura fanno parte del contesto di un'operazione asincrona. In altre parole, le operazioni asincrone ereditano per impostazione predefinita i valori delle CurrentCulture proprietà e CurrentUICulture del thread da cui vengono avviate. Se le impostazioni cultura correnti o le impostazioni cultura correnti dell'interfaccia utente differiscono dalle impostazioni cultura di sistema, le impostazioni cultura correnti superano i limiti del thread e diventano le impostazioni cultura correnti del thread del pool di thread che esegue un'operazione asincrona.

Nell'esempio seguente viene illustrato questo concetto. L'esempio definisce un Func<TResult> delegato, formatDelegate, che restituisce alcuni numeri formattati come valori di valuta. Nell'esempio le impostazioni cultura di sistema correnti vengono modificate in francese (Francia) o, se francese (Francia) è già la lingua corrente, inglese (Stati Uniti). Quindi:

  • Richiama direttamente il delegato in modo che venga eseguito in modo sincrono nel thread principale dell'app.
  • Crea un'attività che esegue il delegato in modo asincrono in un thread del pool di thread.
  • Crea un'attività che esegue il delegato in modo sincrono nel thread principale dell'app chiamando il Task.RunSynchronously metodo .

Come illustrato nell'output dell'esempio, quando le impostazioni cultura correnti vengono modificate in Francese (Francia), le impostazioni cultura correnti del thread da cui le attività vengono richiamate in modo asincrono diventano le impostazioni cultura correnti per tale operazione asincrona.

using System;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;

public class AsyncCultureEx1
{
    public static void Main()
    {
        decimal[] values = { 163025412.32m, 18905365.59m };
        string formatString = "C2";

        string FormatDelegate()
        {
            string output = $"Formatting using the {CultureInfo.CurrentCulture.Name} " +
            "culture on thread {Thread.CurrentThread.ManagedThreadId}.\n";
            foreach (decimal value in values)
                output += $"{value.ToString(formatString)}   ";

            output += Environment.NewLine;
            return output;
        }

        Console.WriteLine($"The example is running on thread {Thread.CurrentThread.ManagedThreadId}");
        // Make the current culture different from the system culture.
        Console.WriteLine($"The current culture is {CultureInfo.CurrentCulture.Name}");
        if (CultureInfo.CurrentCulture.Name == "fr-FR")
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
        else
            Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

        Console.WriteLine($"Changed the current culture to {CultureInfo.CurrentCulture.Name}.\n");

        // Execute the delegate synchronously.
        Console.WriteLine("Executing the delegate synchronously:");
        Console.WriteLine(FormatDelegate());

        // Call an async delegate to format the values using one format string.
        Console.WriteLine("Executing a task asynchronously:");
        var t1 = Task.Run(FormatDelegate);
        Console.WriteLine(t1.Result);

        Console.WriteLine("Executing a task synchronously:");
        var t2 = new Task<string>(FormatDelegate);
        t2.RunSynchronously();
        Console.WriteLine(t2.Result);
    }
}
// The example displays the following output:
//         The example is running on thread 1
//         The current culture is en-US
//         Changed the current culture to fr-FR.
//
//         Executing the delegate synchronously:
//         Formatting using the fr-FR culture on thread 1.
//         163 025 412,32 €   18 905 365,59 €
//
//         Executing a task asynchronously:
//         Formatting using the fr-FR culture on thread 3.
//         163 025 412,32 €   18 905 365,59 €
//
//         Executing a task synchronously:
//         Formatting using the fr-FR culture on thread 1.
//         163 025 412,32 €   18 905 365,59 €

DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture sono proprietà di dominio per app, ovvero stabiliscono impostazioni cultura predefinite per tutti i thread non assegnate in modo esplicito a impostazioni cultura in un dominio applicazione specifico. Tuttavia, per le app destinate a .NET Framework 4.6 o versioni successive, le impostazioni cultura del thread chiamante rimangono parte del contesto di un'attività asincrona anche se l'attività supera i limiti del dominio dell'app.

Serializzazione di oggetti CultureInfo

Quando un CultureInfo oggetto viene serializzato, tutto ciò che viene effettivamente archiviato è Name e UseUserOverride. Viene deserializzato correttamente solo in un ambiente in cui Name ha lo stesso significato. I tre esempi seguenti illustrano perché questo non è sempre il caso:

  • Se il valore della CultureTypes proprietà è CultureTypes.InstalledWin32Culturese se tali impostazioni cultura sono state introdotte per la prima volta in una determinata versione del sistema operativo Windows, non è possibile deserializzarla in una versione precedente di Windows. Ad esempio, se sono state introdotte impostazioni cultura in Windows 10, non può essere deserializzato in Windows 8.

  • Se il CultureTypes valore è CultureTypes.UserCustomCulturee il computer in cui è deserializzato non dispone di impostazioni cultura personalizzate dell'utente installate, non è possibile deserializzarlo.

  • Se il CultureTypes valore è CultureTypes.ReplacementCulturese il computer in cui viene deserializzato non dispone di queste impostazioni cultura di sostituzione, deserializza con lo stesso nome, ma non tutte le stesse caratteristiche. Ad esempio, se en-US si tratta di impostazioni cultura di sostituzione nel computer A, ma non nel computer B, e se un CultureInfo oggetto che fa riferimento a queste impostazioni cultura viene serializzato nel computer A e deserializzato nel computer B, nessuna delle caratteristiche personalizzate delle impostazioni cultura viene trasmessa. La cultura deserializza correttamente, ma con un significato diverso.

Pannello di controllo sostituzioni

L'utente potrebbe scegliere di eseguire l'override di alcuni dei valori associati alle impostazioni cultura correnti di Windows tramite la parte delle opzioni internazionali e della lingua di Pannello di controllo. Ad esempio, l'utente potrebbe scegliere di visualizzare la data in un formato diverso o di usare una valuta diversa da quella predefinita per le impostazioni cultura. In generale, le applicazioni devono rispettare queste sostituzioni utente.

Se UseUserOverride è true e le impostazioni cultura specificate corrispondono alle impostazioni cultura correnti di Windows, CultureInfo utilizza tali override, incluse le impostazioni utente per le proprietà dell'istanza DateTimeFormatInfo restituita dalla DateTimeFormat proprietà e le proprietà dell'istanza NumberFormatInfo restituita dalla NumberFormat proprietà . Se le impostazioni utente non sono compatibili con le impostazioni cultura associate a CultureInfo, ad esempio, se il calendario selezionato non è uno dei OptionalCalendars, i risultati dei metodi e i valori delle proprietà non sono definiti.

Ordinamento alternativo

Alcune impostazioni cultura supportano più di un ordinamento. Ad esempio:

  • Le impostazioni cultura spagnola (Spagna) hanno due ordini di ordinamento: l'ordinamento internazionale predefinito e l'ordinamento tradizionale. Quando si crea un'istanza di un CultureInfo oggetto con il nome delle es-ES impostazioni cultura, viene utilizzato l'ordinamento internazionale. Quando si crea un'istanza di un CultureInfo oggetto con il nome delle es-ES-tradnl impostazioni cultura, viene usato l'ordinamento tradizionale.

  • Le zh-CN impostazioni cultura (cinese semplificato, PRC) supportano due ordinamenti: per pronuncia (impostazione predefinita) e per numero di tratti. Quando si crea un'istanza di un CultureInfo oggetto con il nome delle zh-CN impostazioni cultura, viene usato l'ordinamento predefinito. Quando si crea un'istanza di un CultureInfo oggetto con un identificatore locale di 0x00020804, le stringhe vengono ordinate in base al numero di tratti.

Nella tabella seguente sono elencate le impostazioni cultura che supportano gli ordinamenti alternativi e gli identificatori per gli ordinamenti predefiniti e alternativi.

Nome impostazioni cultura Cultura Nome e identificatore di ordinamento predefiniti Nome e identificatore di ordinamento alternativi
es-ES Spagnolo (Spagna) Internazionale: 0x00000C0A Tradizionale: 0x0000040A
zh-TW Cinese (Taiwan) Conteggio tratti: 0x00000404 Bopomofo: 0x00030404
zh-CN Cinese (RPC) Pronuncia: 0x00000804 Conteggio tratti: 0x00020804
zh-HK Cinese (Hong Kong -R.A.S) Conteggio tratti: 0x00000c04 Conteggio tratti: 0x00020c04
zh-SG Cinese (Singapore) Pronuncia: 0x00001004 Conteggio tratti: 0x00021004
zh-MO Cinese (RAS di Macao) Pronuncia: 0x00001404 Conteggio tratti: 0x00021404
ja-JP Giapponese (Giappone) Impostazione predefinita: 0x00000411 Unicode: 0x00010411
ko-KR Coreano (Corea) Impostazione predefinita: 0x00000412 Coreano Xwansung - Unicode: 0x00010412
de-DE Tedesco (Germania) Dizionario: 0x00000407 TELEFONO Book Sort DIN: 0x00010407
hu-HU Ungherese (Ungheria) Impostazione predefinita: 0x0000040e Ordinamento tecnico: 0x0001040e
ka-GE Georgiano (Georgia) Tradizionale: 0x00000437 Ordinamento moderno: 0x00010437

Impostazioni cultura correnti e app UWP

Nelle app piattaforma UWP (Universal Windows Platform) (UWP) le CurrentCulture proprietà e CurrentUICulture sono di lettura/scrittura, proprio come nelle app .NET Framework e .NET Core. Tuttavia, le app UWP riconoscono una singola cultura. Le CurrentCulture proprietà e CurrentUICulture e corrispondono al primo valore dell'insieme Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages .

Nelle app .NET le impostazioni cultura correnti sono un'impostazione per thread e le CurrentCulture proprietà e CurrentUICulture riflettono solo le impostazioni cultura e le impostazioni cultura dell'interfaccia utente del thread corrente. Nelle app UWP le impostazioni cultura correnti vengono mappate all'insieme Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages , che è un'impostazione globale. L'impostazione della CurrentCulture proprietà o CurrentUICulture modifica le impostazioni cultura dell'intera app. Le impostazioni cultura non possono essere impostate per ogni thread.