Proprietà System.Globalization.CultureInfo.CurrentCulture

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

L'oggetto CultureInfo restituito dalla proprietà e dai CurrentCulture relativi oggetti associati determina il formato predefinito per date, ore, numeri e valori di valuta, l'ordinamento del testo, le convenzioni di maiuscole e minuscole e i confronti di stringhe.

Le impostazioni cultura correnti sono una proprietà del thread in esecuzione. Quando si imposta questa proprietà su un CultureInfo oggetto che rappresenta nuove impostazioni cultura, viene modificato anche il valore della Thread.CurrentThread.CurrentCulture proprietà . È tuttavia consigliabile usare sempre la CultureInfo.CurrentCulture proprietà per recuperare e impostare le impostazioni cultura correnti.

L'oggetto CultureInfo restituito da questa proprietà è di sola lettura. Ciò significa che non è possibile modificare l'oggetto esistente, ad esempio modificando .DateTimeFormat Per modificare il formato di data e ora o altri aspetti delle impostazioni cultura correnti, creare un nuovo CultureInfo oggetto e assegnarlo alla proprietà .

Come viene determinata la cultura di un thread

All'avvio di un thread, le impostazioni cultura vengono inizialmente determinate come segue:

  • Recuperando le impostazioni cultura specificate dalla DefaultThreadCurrentCulture proprietà nel dominio applicazione in cui viene eseguito il thread, se il valore della proprietà non nullè .

  • Se il thread è un thread del pool di thread che esegue un'operazione asincrona basata su attività, le impostazioni cultura sono determinate dalle impostazioni cultura del thread chiamante. L'esempio seguente modifica le impostazioni cultura correnti in portoghese (Brasile) e avvia sei attività, ognuna delle quali visualizza l'ID thread, l'ID attività e le impostazioni cultura correnti. Ognuna delle attività (e dei thread) ha ereditato le impostazioni cultura del thread chiamante.

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Runtime.Versioning;
    using System.Threading;
    using System.Threading.Tasks;
    
    public class Example14
    {
        public static async Task Main()
        {
            var tasks = new List<Task>();
            Console.WriteLine("The current culture is {0}",
                              Thread.CurrentThread.CurrentCulture.Name);
            Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");
            // Change the current culture to Portuguese (Brazil).
            Console.WriteLine("Current culture changed to {0}",
                              Thread.CurrentThread.CurrentCulture.Name);
            Console.WriteLine("Application thread is thread {0}",
                              Thread.CurrentThread.ManagedThreadId);
            // Launch six tasks and display their current culture.
            for (int ctr = 0; ctr <= 5; ctr++)
                tasks.Add(Task.Run(() =>
                {
                    Console.WriteLine("Culture of task {0} on thread {1} is {2}",
                                      Task.CurrentId,
                                      Thread.CurrentThread.ManagedThreadId,
                                      Thread.CurrentThread.CurrentCulture.Name);
                }));
    
            await Task.WhenAll(tasks.ToArray());
        }
    }
    // The example displays output like the following:
    //     The current culture is en-US
    //     Current culture changed to pt-BR
    //     Application thread is thread 9
    //     Culture of task 2 on thread 11 is pt-BR
    //     Culture of task 1 on thread 10 is pt-BR
    //     Culture of task 3 on thread 11 is pt-BR
    //     Culture of task 5 on thread 11 is pt-BR
    //     Culture of task 6 on thread 11 is pt-BR
    //     Culture of task 4 on thread 10 is pt-BR
    
    Imports System.Globalization
    Imports System.Threading
    
    Module Example1
        Public Sub S1()
            Dim tasks As New List(Of Task)
            Console.WriteLine("The current culture is {0}",
                            Thread.CurrentThread.CurrentCulture.Name)
            Thread.CurrentThread.CurrentCulture = New CultureInfo("pt-BR")
            ' Change the current culture to Portuguese (Brazil).
            Console.WriteLine("Current culture changed to {0}",
                            Thread.CurrentThread.CurrentCulture.Name)
            Console.WriteLine("Application thread is thread {0}",
                            Thread.CurrentThread.ManagedThreadId)
            ' Launch six tasks and display their current culture.
            For ctr As Integer = 0 To 5
                tasks.Add(Task.Run(Sub()
                                       Console.WriteLine("Culture of task {0} on thread {1} is {2}",
                                                     Task.CurrentId,
                                                     Thread.CurrentThread.ManagedThreadId,
                                                     Thread.CurrentThread.CurrentCulture.Name)
                                   End Sub))
            Next
            Task.WaitAll(tasks.ToArray())
        End Sub
    End Module
    ' The example displays output like the following:
    '     The current culture is en-US
    '     Current culture changed to pt-BR
    '     Application thread is thread 9
    '     Culture of task 2 on thread 11 is pt-BR
    '     Culture of task 1 on thread 10 is pt-BR
    '     Culture of task 3 on thread 11 is pt-BR
    '     Culture of task 5 on thread 11 is pt-BR
    '     Culture of task 6 on thread 11 is pt-BR
    '     Culture of task 4 on thread 10 is pt-BR
    

    Per altre informazioni, vedere Impostazioni cultura e operazioni asincrone basate su attività.

  • Chiamando la GetUserDefaultLocaleName funzione in Windows o la uloc_getDefault funzione da ICU, che attualmente chiama la funzione POSIX setlocale con categoria LC_MESSAGES, nei sistemi simili a Unix.

Si noti che se si impostano impostazioni cultura specifiche diverse dalle impostazioni cultura installate dal sistema o dalle impostazioni cultura preferite dell'utente e l'applicazione avvia più thread, le impostazioni cultura correnti di tali thread saranno le impostazioni cultura restituite dalla GetUserDefaultLocaleName funzione, a meno che non si assegnino impostazioni cultura alla DefaultThreadCurrentCulture proprietà nel dominio applicazione in cui viene eseguito il thread.

Per altre informazioni sulla modalità di determinazione delle impostazioni cultura di un thread, vedere la sezione "Impostazioni cultura e thread" nella pagina di CultureInfo riferimento.

Ottenere le impostazioni cultura correnti

La CultureInfo.CurrentCulture proprietà è un'impostazione per thread, ovvero ogni thread può avere impostazioni cultura specifiche. Per ottenere le impostazioni cultura del thread corrente, recuperare il valore della CultureInfo.CurrentCulture proprietà , come illustrato nell'esempio seguente.

using System;
using System.Globalization;

public class Example5
{
   public static void Main()
   {
      CultureInfo culture = CultureInfo.CurrentCulture;
      Console.WriteLine("The current culture is {0} [{1}]",
                        culture.NativeName, culture.Name);
   }
}
// The example displays output like the following:
//       The current culture is English (United States) [en-US]
Imports System.Globalization

Module Example3
    Public Sub S1()
        Dim culture As CultureInfo = CultureInfo.CurrentCulture
        Console.WriteLine("The current culture is {0} [{1}]",
                        culture.NativeName, culture.Name)
    End Sub
End Module
' The example displays output like the following:
'     The current culture is English (United States) [en-US]

Impostare la proprietà CurrentCulture in modo esplicito

Per modificare le impostazioni cultura usate da un thread esistente, impostare la CultureInfo.CurrentCulture proprietà sulle nuove impostazioni cultura. Se si modificano in modo esplicito le impostazioni cultura di un thread, tale modifica persiste se il thread supera i limiti del dominio applicazione. Nell'esempio seguente le impostazioni cultura del thread corrente vengono modificate in Olandese (Paesi Bassi). Mostra anche che, quando il thread corrente supera i limiti del dominio applicazione, le impostazioni cultura correnti rimangono modificate.

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

public class Info11 : MarshalByRefObject
{
    public void ShowCurrentCulture()
    {
        Console.WriteLine("Culture of {0} in application domain {1}: {2}",
                          Thread.CurrentThread.Name,
                          AppDomain.CurrentDomain.FriendlyName,
                          CultureInfo.CurrentCulture.Name);
    }
}

public class Example11
{
    public static void Main()
    {
        Info11 inf = new Info11();
        // Set the current culture to Dutch (Netherlands).
        Thread.CurrentThread.Name = "MainThread";
        CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL");
        inf.ShowCurrentCulture();

        // Create a new application domain.
        AppDomain ad = AppDomain.CreateDomain("Domain2");
        Info11 inf2 = (Info11)ad.CreateInstanceAndUnwrap(typeof(Info11).Assembly.FullName, "Info11");
        inf2.ShowCurrentCulture();
    }
}
// The example displays the following output:
//       Culture of MainThread in application domain ChangeCulture1.exe: nl-NL
//       Culture of MainThread in application domain Domain2: nl-NL
Imports System.Globalization
Imports System.Threading

Public Class Info : Inherits MarshalByRefObject
   Public Sub ShowCurrentCulture()
      Console.WriteLine("Culture of {0} in application domain {1}: {2}",
                        Thread.CurrentThread.Name,
                        AppDomain.CurrentDomain.FriendlyName,
                        CultureInfo.CurrentCulture.Name)
   End Sub
End Class

Module Example2
    Public Sub S1()
        Dim inf As New Info()
        ' Set the current culture to Dutch (Netherlands).
        Thread.CurrentThread.Name = "MainThread"
        CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL")
        inf.ShowCurrentCulture()

        ' Create a new application domain.
        Dim ad As AppDomain = AppDomain.CreateDomain("Domain2")
        Dim inf2 As Info = CType(ad.CreateInstanceAndUnwrap(GetType(Info).Assembly.FullName, "Info"),
                          Info)
        inf2.ShowCurrentCulture()
    End Sub
End Module
' This example displays the following output:
'       Culture of MainThread in application domain Example.exe: nl-NL
'       Culture of MainThread in application domain Domain2: nl-NL

Nota

La modifica delle impostazioni cultura tramite la CultureInfo.CurrentCulture proprietà richiede un'autorizzazione SecurityPermission con il ControlThread valore impostato. La modifica dei thread è pericolosa a causa dello stato di sicurezza associato ai thread. Pertanto, questa autorizzazione deve essere concessa solo al codice attendibile e quindi solo in base alle esigenze. Non è possibile modificare le impostazioni cultura dei thread nel codice semi-attendibile.

A partire da .NET Framework 4, è possibile modificare in modo esplicito le impostazioni cultura del thread corrente in impostazioni cultura specifiche ( ad esempio francese (Canada) o impostazioni cultura neutre (ad esempio francese). Quando un CultureInfo oggetto rappresenta impostazioni cultura neutre, i valori delle CultureInfo proprietà, ad Calendaresempio , DateTimeFormatCompareInfo, NumberFormat, e TextInfo riflettono le impostazioni cultura specifiche associate alle impostazioni cultura neutre. Ad esempio, le impostazioni cultura dominanti per le impostazioni cultura indipendenti dall'inglese sono inglese (Stati Uniti); le impostazioni cultura dominanti per le impostazioni cultura tedesche sono tedesche (Germania). Nell'esempio seguente viene illustrata la differenza nella formattazione quando le impostazioni cultura correnti sono impostate su impostazioni cultura specifiche, francese (Canada) e impostazioni cultura neutre, francese.

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

public class Example12
{
   public static void Main()
   {
      double value = 1634.92;
      CultureInfo.CurrentCulture = new CultureInfo("fr-CA");
      Console.WriteLine("Current Culture: {0}",
                        CultureInfo.CurrentCulture.Name);
      Console.WriteLine("{0:C2}\n", value);

      Thread.CurrentThread.CurrentCulture = new CultureInfo("fr");
      Console.WriteLine("Current Culture: {0}",
                        CultureInfo.CurrentCulture.Name);
      Console.WriteLine("{0:C2}", value);
   }
}
// The example displays the following output:
//       Current Culture: fr-CA
//       1 634,92 $
//
//       Current Culture: fr
//       1 634,92 €
Imports System.Globalization
Imports System.Threading

Module Example4
    Public Sub S1()
        Dim value As Double = 1634.92
        CultureInfo.CurrentCulture = New CultureInfo("fr-CA")
        Console.WriteLine("Current Culture: {0}",
                        CultureInfo.CurrentCulture.Name)
        Console.WriteLine("{0:C2}", value)
        Console.WriteLine()

        Thread.CurrentThread.CurrentCulture = New CultureInfo("fr")
        Console.WriteLine("Current Culture: {0}",
                        CultureInfo.CurrentCulture.Name)
        Console.WriteLine("{0:C2}", value)
    End Sub
End Module
' The example displays the following output:
'       Current Culture: fr-CA
'       1 634,92 $
'       
'       Current Culture: fr
'       1 634,92 €

È anche possibile utilizzare la CultureInfo.CurrentCulture proprietà insieme alla HttpRequest.UserLanguages proprietà per impostare la CurrentCulture proprietà di un'applicazione ASP.NET sulle impostazioni cultura preferite dell'utente, come illustrato nell'esempio seguente.

CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(Request13.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages(0))

Impostazioni cultura e override dell'utente correnti

Windows consente agli utenti di eseguire l'override dei valori delle proprietà standard dell'oggetto CultureInfo e degli oggetti associati tramite Opzioni internazionali e della lingua in Pannello di controllo. L'oggetto CultureInfo restituito dalla CurrentCulture proprietà riflette queste sostituzioni utente nei casi seguenti:

  • Se le impostazioni cultura del thread corrente sono impostate in modo implicito dalla funzione Windows GetUserDefaultLocaleName .

  • Se le impostazioni cultura del thread correnti definite dalla DefaultThreadCurrentCulture proprietà corrispondono alle impostazioni cultura di sistema di Windows correnti.

  • Se le impostazioni cultura del thread corrente vengono impostate in modo esplicito su impostazioni cultura restituite dal CreateSpecificCulture metodo e tali impostazioni cultura corrispondono alle impostazioni cultura di sistema di Windows correnti.

  • Se le impostazioni cultura del thread corrente vengono impostate in modo esplicito su impostazioni cultura create dal CultureInfo(String) costruttore e tali impostazioni cultura corrispondono alle impostazioni cultura correnti del sistema Windows.

In alcuni casi, in particolare per le applicazioni server, l'impostazione delle impostazioni cultura correnti su un CultureInfo oggetto che riflette le sostituzioni utente potrebbe essere indesiderato. È invece possibile impostare le impostazioni cultura correnti su un CultureInfo oggetto che non riflette le sostituzioni utente nei modi seguenti:

Impostazioni cultura correnti e app UWP

Nelle app piattaforma UWP (Universal Windows Platform) (UWP) la CurrentCulture proprietà è di lettura/scrittura, proprio come avviee nelle app .NET Framework e .NET Core. È possibile usarla sia per ottenere che per impostare le impostazioni cultura correnti. Tuttavia, le app UWP non distinguono le impostazioni cultura correnti e le impostazioni cultura correnti dell'interfaccia utente. Le CurrentCulture proprietà e CurrentUICulture e corrispondono al primo valore dell'insieme Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages .

Nelle app .NET Framework e .NET Core le impostazioni cultura correnti sono un'impostazione per thread e la CurrentCulture proprietà riflette solo le impostazioni cultura del thread corrente. Nelle app UWP le impostazioni cultura correnti vengono mappate alla proprietà Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages , ovvero un'impostazione globale. L'impostazione della CurrentCulture proprietà modifica le impostazioni cultura dell'intera app. Le impostazioni cultura non possono essere impostate per ogni thread.