CultureInfo.CurrentCulture 屬性

定義

取得或設定 CultureInfo 代表當前執行緒及基於任務的非同步操作所使用的文化的物件。

public:
 static property System::Globalization::CultureInfo ^ CurrentCulture { System::Globalization::CultureInfo ^ get(); void set(System::Globalization::CultureInfo ^ value); };
public:
 static property System::Globalization::CultureInfo ^ CurrentCulture { System::Globalization::CultureInfo ^ get(); };
public static System.Globalization.CultureInfo CurrentCulture { get; set; }
public static System.Globalization.CultureInfo CurrentCulture { get; }
static member CurrentCulture : System.Globalization.CultureInfo with get, set
static member CurrentCulture : System.Globalization.CultureInfo
Public Shared Property CurrentCulture As CultureInfo
Public Shared ReadOnly Property CurrentCulture As CultureInfo

屬性值

目前執行緒與基於任務的非同步操作所採用的文化。

例外狀況

屬性設定為 null

範例

以下範例示範如何更改 CurrentCulture 當前執行緒的 和 CurrentUICulture

using System;
using System.Globalization;

public class Example0
{
   public static void Main()
   {
      // Display the name of the current culture.
      Console.WriteLine("CurrentCulture is {0}.", CultureInfo.CurrentCulture.Name);

      // Change the current culture to th-TH.
      CultureInfo.CurrentCulture = new CultureInfo("th-TH", false);
      Console.WriteLine("CurrentCulture is now {0}.", CultureInfo.CurrentCulture.Name);

      // Display the name of the current UI culture.
      Console.WriteLine("CurrentUICulture is {0}.", CultureInfo.CurrentUICulture.Name);

      // Change the current UI culture to ja-JP.
      CultureInfo.CurrentUICulture = new CultureInfo( "ja-JP", false );
      Console.WriteLine("CurrentUICulture is now {0}.", CultureInfo.CurrentUICulture.Name);
   }
}

// The example displays the following output:
//       CurrentCulture is en-US.
//       CurrentCulture is now th-TH.
//       CurrentUICulture is en-US.
//       CurrentUICulture is now ja-JP.
Imports System.Globalization
Imports System.Threading

Public Module Example2
   Public Sub Run()
      ' Display the name of the current culture.
      Console.WriteLine("CurrentCulture is {0}.", CultureInfo.CurrentCulture.Name)

      ' Change the current culture to th-TH.
      CultureInfo.CurrentCulture = New CultureInfo("th-TH", False)
      Console.WriteLine("CurrentCulture is now {0}.", CultureInfo.CurrentCulture.Name)

      ' Display the name of the current UI culture.
      Console.WriteLine("CurrentUICulture is {0}.", CultureInfo.CurrentUICulture.Name)

      ' Change the current UI culture to ja-JP.
      CultureInfo.CurrentUICulture = New CultureInfo("ja-JP", False)
      Console.WriteLine("CurrentUICulture is now {0}.", CultureInfo.CurrentUICulture.Name)
   End Sub
End Module
' The example displays the following output:
'       CurrentCulture is en-US.
'       CurrentCulture is now th-TH.
'       CurrentUICulture is en-US.
'       CurrentUICulture is now ja-JP.

備註

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

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

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

如何判斷線程的文化特性

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

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

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

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    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 {Thread.CurrentThread.CurrentCulture.Name}");
            Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");
            // Change the current culture to Portuguese (Brazil).
            Console.WriteLine($"Current culture changed to {Thread.CurrentThread.CurrentCulture.Name}");
            Console.WriteLine($"Application thread is thread {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 {Task.CurrentId} on thread {Thread.CurrentThread.ManagedThreadId} is {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 函式或在 Unix 類似系統中從 uloc_getDefault 呼叫 函式,該函式目前會呼叫具有類別 setlocale 的 POSIX LC_MESSAGES 函式。

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

如需了解有關線程的文化設定方式的詳細資訊,請參閱參考頁面中的 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 {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 thread {Thread.CurrentThread.Name}: {CultureInfo.CurrentCulture.Name}");
    }
}

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

// The example displays the following output:
//
//     Culture of thread MainThread: nl-NL

Note

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

你可以明確地將目前的討論串文化改成特定文化(例如法語(加拿大))或中立文化(例如法語)。 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: {CultureInfo.CurrentCulture.Name}");
      Console.WriteLine($"{value:C2}\n");

      Thread.CurrentThread.CurrentCulture = new CultureInfo("fr");
      Console.WriteLine($"Current Culture: {CultureInfo.CurrentCulture.Name}");
      Console.WriteLine($"{value:C2}");
   }
}

// 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 €

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

Windows 可讓使用者使用 [控制面板] 中的 CultureInfo 來覆寫 物件及其相關聯物件的標準屬性值。 CultureInfo 屬性所傳回的物件會在下列情況中反映這些使用者覆寫:

  • 如果目前的線程文化特性隱含地由 Windows 函式設定。
  • 如果由DefaultThreadCurrentCulture屬性所定義的目前執行緒文化對應於目前的 Windows 系統文化。
  • 如果目前的執行緒文化特性被明確設定為由 CreateSpecificCulture 方法傳回的文化特性,且該文化特性對應至目前的 Windows 系統文化特性。
  • 如果當前的執行緒文化特性被明確設置為由 CultureInfo(String) 建構函式實例化的文化特性,且該文化特性與當前的 Windows 系統文化特性一致。

在某些情況下,特別是針對伺服器應用程式,將當前的文化設置為反映用戶自定義的對象可能是不理想的。 相反地,您可以將目前的文化特性設定為一個 CultureInfo 物件,此物件不會以使用者覆寫的方式來反映文化特性。

適用於

另請參閱