System.Globalization.CultureInfo.CurrentCulture 属性

本文提供此 API 參考文件的補充備註。

CultureInfo屬性及其相關聯物件所CurrentCulture傳回的物件會決定日期、時間、數位和貨幣值的預設格式、文字排序順序、大小寫慣例和字串比較。

目前的文化特性是執行線程的屬性。 當您將這個屬性設定為 CultureInfo 代表新文化特性的物件時,屬性的值 Thread.CurrentThread.CurrentCulture 也會變更。 不過,建議您一律使用 CultureInfo.CurrentCulture 屬性來擷取和設定目前的文化特性。

CultureInfo這個屬性傳回的物件是唯讀的。 這表示您無法藉由變更 DateTimeFormat來變動現有的物件。 若要變更日期時間格式或目前文化特性的一些其他層面,請建立新的 CultureInfo 物件,並將它指派給 屬性。

如何判斷線程的文化特性

啟動線程時,其文化特性一開始會決定如下:

  • 藉由擷取線程執行所在的應用程式域中屬性所 DefaultThreadCurrentCulture 指定的文化特性,如果屬性值不是 ,則為 null

  • 如果線程是執行以工作為基礎的異步操作的線程集區線程,其文化特性取決於呼叫線程的文化特性。 下列範例會將目前的文化特性變更為葡萄牙文(巴西),並啟動六項工作,其中每個工作都會顯示其線程標識碼、工作標識碼,以及其目前文化特性。 每個工作(和線程)都繼承呼叫線程的文化特性。

    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
    

    如需詳細資訊,請參閱 文化特性和工作型異步操作

  • 藉由在 Windows 上呼叫 GetUserDefaultLocaleName 函式或 ICU uloc_getDefault函式,此函式目前在 Unix 類似系統上呼叫類別LC_MESSAGES為 的 POSIX setlocale 函式。

請注意,如果您設定與系統安裝文化特性或使用者慣用文化特性不同的特定文化特性,而且您的應用程式會啟動多個線程,除非您將文化特性指派給DefaultThreadCurrentCulture線程執行所在的應用程式域中的屬性,否則這些線程目前的文化特性將會是函式所傳回GetUserDefaultLocaleName的文化特性。

如需如何判斷線程文化特性的詳細資訊,請參閱參考頁面中的 CultureInfo 一節。

取得目前的文化特性

屬性 CultureInfo.CurrentCulture 是每個線程的設定;也就是說,每個線程都可以有自己的文化特性。 您可以藉由擷取 屬性的值 CultureInfo.CurrentCulture 來取得目前線程的文化特性,如下列範例所示。

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]

明確設定 CurrentCulture 屬性

若要變更現有線程所使用的文化特性,請將 屬性設定 CultureInfo.CurrentCulture 為新的文化特性。 如果您以這種方式明確變更線程的文化特性,則線程跨越應用程式域界限時,該變更會持續發生。 下列範例會將目前的線程文化特性變更為荷蘭文(荷蘭)。 它也顯示,當目前的線程跨越應用程式域界限時,其目前的文化特性仍會變更。

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

注意

使用 CultureInfo.CurrentCulture 屬性變更文化特性需要 SecurityPermission 具有設定值的許可權 ControlThread 。 操作線程很危險,因為與線程相關聯的安全性狀態。 因此,此許可權應該只提供給可信任的程式代碼,然後才視需要提供。 您無法在半信任的程式代碼中變更線程文化特性。

從 .NET Framework 4 開始,您可以將目前的線程文化特性明確變更為特定文化特性(例如法文(例如加拿大)或中性文化特性(例如法文)。 CultureInfo當物件代表中性文化特性時,屬性的值CultureInfo,例如 CalendarCompareInfoDateTimeFormatNumberFormatTextInfo 會反映與中性文化特性相關聯的特定文化特性。 例如,英文中性文化的主要文化是英文(美國):德國文化的主導文化是德文(德國)。 下列範例說明當目前文化特性設定為特定文化特性、法文(加拿大)和中性文化、法文時,格式設定的差異。

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 €

您也可以使用 CultureInfo.CurrentCulture 屬性和 HttpRequest.UserLanguages 屬性,將 ASP.NET 應用程式的 屬性設定 CurrentCulture 為使用者慣用的文化特性,如下列範例所示。

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

目前的文化特性和使用者覆寫

Windows 可讓使用者在 控制台 中使用地區和語言選項來覆寫物件及其相關聯對象的標準屬性值CultureInfoCultureInfo屬性傳CurrentCulture回的物件會反映下列情況中的這些使用者覆寫:

  • 如果 Windows 函式隱含 GetUserDefaultLocaleName 地設定目前的線程文化特性。

  • 如果屬性所 DefaultThreadCurrentCulture 定義的目前線程文化特性對應至目前的 Windows 系統文化特性。

  • 如果目前的線程文化特性明確設定為 方法所 CreateSpecificCulture 傳回的文化特性,且該文化特性對應至目前的 Windows 系統文化特性。

  • 如果目前的線程文化特性明確設定為建構函式所 CultureInfo(String) 具現化的文化特性,且該文化特性對應至目前的 Windows 系統文化特性。

在某些情況下,特別是針對伺服器應用程式,將目前的文化特性設定為 CultureInfo 反映使用者覆寫的物件可能不受歡迎。 相反地,您可以將目前的文化特性設定為 CultureInfo 不會以下列方式反映使用者覆寫的物件:

目前的文化特性和UWP應用程式

在 通用 Windows 平台 (UWP) 應用程式中,CurrentCulture屬性是可擦寫的,就像在 .NET Framework 和 .NET Core 應用程式中一樣;您可以使用它來取得和設定目前的文化特性。 不過,UWP 應用程式不會區分目前的文化特性和目前的UI文化特性。 CurrentCultureCurrentUICulture 屬性會對應至 Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages 集合中的第一個值。

在 .NET Framework 和 .NET Core 應用程式中,目前的文化特性是個別線程設定,而 CurrentCulture 屬性只會反映目前線程的文化特性。 在UWP應用程式中,目前的文化特性會對應至 Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages 屬性,這是全域設定。 設定 屬性會 CurrentCulture 變更整個應用程式的文化特性;文化特性不能以每個線程為基礎設定。