CultureInfo Kelas

Definisi

Menyediakan informasi tentang budaya tertentu (disebut lokal untuk pengembangan kode yang tidak dikelola). Informasi tersebut mencakup nama untuk budaya, sistem penulisan, kalender yang digunakan, urutan pengurutan string, dan pemformatan untuk tanggal dan angka.

public ref class CultureInfo : IFormatProvider
public ref class CultureInfo : ICloneable, IFormatProvider
public class CultureInfo : IFormatProvider
public class CultureInfo : ICloneable, IFormatProvider
[System.Serializable]
public class CultureInfo : ICloneable, IFormatProvider
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class CultureInfo : ICloneable, IFormatProvider
type CultureInfo = class
    interface IFormatProvider
type CultureInfo = class
    interface ICloneable
    interface IFormatProvider
[<System.Serializable>]
type CultureInfo = class
    interface ICloneable
    interface IFormatProvider
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type CultureInfo = class
    interface ICloneable
    interface IFormatProvider
Public Class CultureInfo
Implements IFormatProvider
Public Class CultureInfo
Implements ICloneable, IFormatProvider
Warisan
CultureInfo
Atribut
Penerapan

Contoh

Contoh berikut menunjukkan cara membuat CultureInfo objek untuk Spanyol (Spanyol) dengan jenis internasional dan objek lain CultureInfo dengan jenis tradisional.

using namespace System;
using namespace System::Collections;
using namespace System::Globalization;
int main()
{
   
   // Creates and initializes the CultureInfo which uses the international sort.
   CultureInfo^ myCIintl = gcnew CultureInfo( "es-ES",false );
   
   // Creates and initializes the CultureInfo which uses the traditional sort.
   CultureInfo^ myCItrad = gcnew CultureInfo( 0x040A,false );
   
   // Displays the properties of each culture.
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "PROPERTY", "INTERNATIONAL", "TRADITIONAL" );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "CompareInfo", myCIintl->CompareInfo, myCItrad->CompareInfo );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "DisplayName", myCIintl->DisplayName, myCItrad->DisplayName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "EnglishName", myCIintl->EnglishName, myCItrad->EnglishName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "IsNeutralCulture", myCIintl->IsNeutralCulture, myCItrad->IsNeutralCulture );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "IsReadOnly", myCIintl->IsReadOnly, myCItrad->IsReadOnly );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "LCID", myCIintl->LCID, myCItrad->LCID );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "Name", myCIintl->Name, myCItrad->Name );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "NativeName", myCIintl->NativeName, myCItrad->NativeName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "Parent", myCIintl->Parent, myCItrad->Parent );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "TextInfo", myCIintl->TextInfo, myCItrad->TextInfo );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "ThreeLetterISOLanguageName", myCIintl->ThreeLetterISOLanguageName, myCItrad->ThreeLetterISOLanguageName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "ThreeLetterWindowsLanguageName", myCIintl->ThreeLetterWindowsLanguageName, myCItrad->ThreeLetterWindowsLanguageName );
   Console::WriteLine( "{0,-31}{1,-47}{2,-25}", "TwoLetterISOLanguageName", myCIintl->TwoLetterISOLanguageName, myCItrad->TwoLetterISOLanguageName );
   Console::WriteLine();
   
   // Compare two strings using myCIintl -> 
   Console::WriteLine( "Comparing \"llegar\" and \"lugar\"" );
   Console::WriteLine( "   With myCIintl -> CompareInfo -> Compare: {0}", myCIintl->CompareInfo->Compare( "llegar", "lugar" ) );
   Console::WriteLine( "   With myCItrad -> CompareInfo -> Compare: {0}", myCItrad->CompareInfo->Compare( "llegar", "lugar" ) );
}

/*
This code produces the following output.

PROPERTY                       INTERNATIONAL                                  TRADITIONAL              
CompareInfo                    CompareInfo - es-ES                            CompareInfo - es-ES_tradnl
DisplayName                    Spanish (Spain)                                Spanish (Spain)          
EnglishName                    Spanish (Spain, International Sort)            Spanish (Spain, Traditional Sort)
IsNeutralCulture               False                                          False                    
IsReadOnly                     False                                          False                    
LCID                           3082                                           1034                     
Name                           es-ES                                          es-ES                    
NativeName                     Español (España, alfabetización internacional) Español (España, alfabetización tradicional)
Parent                         es                                             es                       
TextInfo                       TextInfo - es-ES                               TextInfo - es-ES_tradnl  
ThreeLetterISOLanguageName     spa                                            spa                      
ThreeLetterWindowsLanguageName ESN                                            ESP                      
TwoLetterISOLanguageName       es                                             es                       

Comparing "llegar" and "lugar"
   With myCIintl -> CompareInfo -> Compare: -1
   With myCItrad -> CompareInfo -> Compare: 1

*/
using System;
using System.Collections;
using System.Globalization;

public class SamplesCultureInfo
{

   public static void Main()
   {

      // Creates and initializes the CultureInfo which uses the international sort.
      CultureInfo myCIintl = new CultureInfo("es-ES", false);

      // Creates and initializes the CultureInfo which uses the traditional sort.
      CultureInfo myCItrad = new CultureInfo(0x040A, false);

      // Displays the properties of each culture.
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "PROPERTY", "INTERNATIONAL", "TRADITIONAL");
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "CompareInfo", myCIintl.CompareInfo, myCItrad.CompareInfo);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "DisplayName", myCIintl.DisplayName, myCItrad.DisplayName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "EnglishName", myCIintl.EnglishName, myCItrad.EnglishName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "IsNeutralCulture", myCIintl.IsNeutralCulture, myCItrad.IsNeutralCulture);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "IsReadOnly", myCIintl.IsReadOnly, myCItrad.IsReadOnly);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "LCID", myCIintl.LCID, myCItrad.LCID);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "Name", myCIintl.Name, myCItrad.Name);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "NativeName", myCIintl.NativeName, myCItrad.NativeName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "Parent", myCIintl.Parent, myCItrad.Parent);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "TextInfo", myCIintl.TextInfo, myCItrad.TextInfo);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "ThreeLetterISOLanguageName", myCIintl.ThreeLetterISOLanguageName, myCItrad.ThreeLetterISOLanguageName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "ThreeLetterWindowsLanguageName", myCIintl.ThreeLetterWindowsLanguageName, myCItrad.ThreeLetterWindowsLanguageName);
      Console.WriteLine("{0,-31}{1,-47}{2,-25}", "TwoLetterISOLanguageName", myCIintl.TwoLetterISOLanguageName, myCItrad.TwoLetterISOLanguageName);
      Console.WriteLine();

      // Compare two strings using myCIintl.
      Console.WriteLine("Comparing \"llegar\" and \"lugar\"");
      Console.WriteLine("   With myCIintl.CompareInfo.Compare: {0}", myCIintl.CompareInfo.Compare("llegar", "lugar"));
      Console.WriteLine("   With myCItrad.CompareInfo.Compare: {0}", myCItrad.CompareInfo.Compare("llegar", "lugar"));
   }
}

/*
This code produces the following output.

PROPERTY                       INTERNATIONAL                                  TRADITIONAL
CompareInfo                    CompareInfo - es-ES                            CompareInfo - es-ES_tradnl
DisplayName                    Spanish (Spain)                                Spanish (Spain)
EnglishName                    Spanish (Spain, International Sort)            Spanish (Spain, Traditional Sort)
IsNeutralCulture               False                                          False
IsReadOnly                     False                                          False
LCID                           3082                                           1034
Name                           es-ES                                          es-ES
NativeName                     Español (España, alfabetización internacional) Español (España, alfabetización tradicional)
Parent                         es                                             es
TextInfo                       TextInfo - es-ES                               TextInfo - es-ES_tradnl
ThreeLetterISOLanguageName     spa                                            spa
ThreeLetterWindowsLanguageName ESN                                            ESP
TwoLetterISOLanguageName       es                                             es

Comparing "llegar" and "lugar"
   With myCIintl.CompareInfo.Compare: -1
   With myCItrad.CompareInfo.Compare: 1

*/
Imports System.Collections
Imports System.Globalization

Module Module1

    Public Sub Main()

        ' Creates and initializes the CultureInfo which uses the international sort.
        Dim myCIintl As New CultureInfo("es-ES", False)

        ' Creates and initializes the CultureInfo which uses the traditional sort.
        Dim myCItrad As New CultureInfo(&H40A, False)

        ' Displays the properties of each culture.
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "PROPERTY", "INTERNATIONAL", "TRADITIONAL")
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "CompareInfo", myCIintl.CompareInfo, myCItrad.CompareInfo)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "DisplayName", myCIintl.DisplayName, myCItrad.DisplayName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "EnglishName", myCIintl.EnglishName, myCItrad.EnglishName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "IsNeutralCulture", myCIintl.IsNeutralCulture, myCItrad.IsNeutralCulture)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "IsReadOnly", myCIintl.IsReadOnly, myCItrad.IsReadOnly)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "LCID", myCIintl.LCID, myCItrad.LCID)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "Name", myCIintl.Name, myCItrad.Name)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "NativeName", myCIintl.NativeName, myCItrad.NativeName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "Parent", myCIintl.Parent, myCItrad.Parent)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "TextInfo", myCIintl.TextInfo, myCItrad.TextInfo)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "ThreeLetterISOLanguageName", myCIintl.ThreeLetterISOLanguageName, myCItrad.ThreeLetterISOLanguageName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "ThreeLetterWindowsLanguageName", myCIintl.ThreeLetterWindowsLanguageName, myCItrad.ThreeLetterWindowsLanguageName)
        Console.WriteLine("{0,-31}{1,-47}{2,-25}", "TwoLetterISOLanguageName", myCIintl.TwoLetterISOLanguageName, myCItrad.TwoLetterISOLanguageName)
        Console.WriteLine()

        ' Compare two strings using myCIintl.
        Console.WriteLine("Comparing ""llegar"" and ""lugar""")
        Console.WriteLine("   With myCIintl.CompareInfo.Compare: {0}", myCIintl.CompareInfo.Compare("llegar", "lugar"))
        Console.WriteLine("   With myCItrad.CompareInfo.Compare: {0}", myCItrad.CompareInfo.Compare("llegar", "lugar"))

    End Sub



'This code produces the following output.
'
'PROPERTY                       INTERNATIONAL                                  TRADITIONAL              
'CompareInfo                    CompareInfo - es-ES                            CompareInfo - es-ES_tradnl
'DisplayName                    Spanish (Spain)                                Spanish (Spain)          
'EnglishName                    Spanish (Spain, International Sort)            Spanish (Spain, Traditional Sort)
'IsNeutralCulture               False                                          False                    
'IsReadOnly                     False                                          False                    
'LCID                           3082                                           1034                     
'Name                           es-ES                                          es-ES                    
'NativeName                     Español (España, alfabetización internacional) Español (España, alfabetización tradicional)
'Parent                         es                                             es                       
'TextInfo                       TextInfo - es-ES                               TextInfo - es-ES_tradnl  
'ThreeLetterISOLanguageName     spa                                            spa                      
'ThreeLetterWindowsLanguageName ESN                                            ESP                      
'TwoLetterISOLanguageName       es                                             es                       
'
'Comparing "llegar" and "lugar"
'   With myCIintl.CompareInfo.Compare: -1
'   With myCItrad.CompareInfo.Compare: 1

End Module

Keterangan

Kelas ini CultureInfo menyediakan informasi khusus budaya, seperti bahasa, subbahasa, negara/wilayah, kalender, dan konvensi yang terkait dengan budaya tertentu. Kelas ini juga menyediakan akses ke instans khusus budaya dari DateTimeFormatInfoobjek , , NumberFormatInfoCompareInfo, dan TextInfo . Objek ini berisi informasi yang diperlukan untuk operasi khusus budaya, seperti casing, pemformatan tanggal dan angka, dan membandingkan string. Kelas CultureInfo ini digunakan baik secara langsung atau tidak langsung oleh kelas yang memformat, mengurai, atau memanipulasi data khusus budaya, seperti String, DateTime, DateTimeOffset, dan jenis numerik.

Di bagian ini:

Nama dan pengidentifikasi budaya
Budaya invarian, netral, dan spesifik
Budaya kustom
Data budaya dinamis
CultureInfo dan data budaya
Budaya saat ini dan budaya UI saat ini
Mendapatkan semua budaya
Budaya dan utas
Domain budaya dan aplikasi
Budaya dan operasi asinkron berbasis tugas
Serialisasi objek CultureInfo
penimpaan Panel Kontrol
Urutan pengurutan alternatif
Aplikasi Budaya dan Windows

Nama dan pengidentifikasi budaya

Kelas CultureInfo menentukan nama unik untuk setiap budaya, berdasarkan RFC 4646. Namanya adalah kombinasi dari kode kultur huruf kecil dua huruf atau tiga huruf ISO 639 yang terkait dengan bahasa dan kode subkultur huruf besar dua huruf ISO 3166 yang terkait dengan negara atau wilayah. Selain itu, untuk aplikasi yang menargetkan .NET Framework 4 atau yang lebih baru dan berjalan di bawah Windows 10 atau yang lebih baru, nama budaya yang sesuai dengan tag bahasa BCP-47 yang valid didukung.

Catatan

Ketika nama budaya diteruskan ke konstruktor kelas atau metode seperti CreateSpecificCulture atau CultureInfo, kasusnya tidak signifikan.

Format untuk nama budaya berdasarkan RFC 4646 adalah languagecode2-country/regioncode2, di mana languagecode2 adalah kode bahasa dua huruf dan country/regioncode2 merupakan kode subkultur dua huruf. Contohnya termasuk ja-JP untuk Bahasa Jepang (Jepang) dan en-US untuk bahasa Inggris (Amerika Serikat). Dalam kasus di mana kode bahasa dua huruf tidak tersedia, kode tiga huruf seperti yang didefinisikan dalam ISO 639-3 digunakan.

Beberapa nama budaya juga menentukan skrip ISO 15924. Misalnya, Cyrl menentukan skrip Sirilik dan Latn menentukan skrip Latin. Nama budaya yang menyertakan skrip menggunakan pola languagecode2country/regioncode2-scripttag-. Contoh jenis nama budaya ini adalah uz-Cyrl-UZ untuk Uzbek (Sirilik, Uzbekistan). Pada sistem operasi Windows sebelum Windows Vista, nama budaya yang menyertakan skrip menggunakan pola languagecode2--country/regioncode2scripttag, misalnya, uz-UZ-Cyrl untuk Uzbekistan (Sirilik, Uzbekistan).

Budaya netral hanya ditentukan oleh kode bahasa dua huruf kecil. Misalnya, fr menentukan budaya netral untuk bahasa Prancis, dan de menentukan budaya netral untuk bahasa Jerman.

Catatan

Ada dua nama budaya yang bertentang dengan aturan ini. Budaya Tionghoa (Sederhana), bernama zh-Hans, dan Cina (Tradisional), bernama zh-Hant, adalah budaya netral. Nama budaya mewakili standar saat ini dan harus digunakan kecuali Anda memiliki alasan untuk menggunakan nama zh-CHS yang lebih lama dan zh-CHT.

Pengidentifikasi budaya adalah singkatan numerik internasional standar dan memiliki komponen yang diperlukan untuk mengidentifikasi salah satu budaya yang diinstal secara unik. Aplikasi Anda dapat menggunakan pengidentifikasi budaya yang telah ditentukan sebelumnya atau menentukan pengidentifikasi kustom.

Nama dan pengidentifikasi budaya tertentu yang telah ditentukan sebelumnya digunakan oleh ini dan kelas lain di System.Globalization namespace layanan. Untuk informasi budaya terperinci untuk sistem Windows, lihat kolom Tag bahasa dalam daftar nama bahasa/wilayah yang didukung oleh Windows. Nama budaya mengikuti standar yang ditentukan oleh BCP 47.

Nama dan pengidentifikasi budaya hanya mewakili subset budaya yang dapat ditemukan di komputer tertentu. Versi Windows atau paket layanan dapat mengubah budaya yang tersedia. Aplikasi dapat menambahkan budaya kustom menggunakan CultureAndRegionInfoBuilder kelas . Pengguna dapat menambahkan budaya kustom mereka sendiri menggunakan alat Microsoft Locale Builder . Microsoft Locale Builder ditulis dalam kode terkelola menggunakan CultureAndRegionInfoBuilder kelas .

Beberapa nama berbeda terkait erat dengan budaya, terutama nama yang terkait dengan anggota kelas berikut:

Budaya invarian, netral, dan spesifik

Budaya umumnya dikelompokkan menjadi tiga set: budaya invarian, budaya netral, dan budaya tertentu.

Budaya invarian tidak peka terhadap budaya. Aplikasi Anda menentukan budaya invarian berdasarkan nama menggunakan string kosong ("") atau oleh pengidentifikasinya. InvariantCulture mendefinisikan instans budaya invarian. Ini dikaitkan dengan bahasa Inggris tetapi tidak dengan negara/wilayah mana pun. Ini digunakan dalam hampir semua metode di Globalization namespace layanan yang membutuhkan budaya.

Budaya netral adalah budaya yang terkait dengan bahasa tetapi tidak dengan negara/wilayah. Budaya tertentu adalah budaya yang terkait dengan bahasa dan negara/wilayah. Misalnya, fr adalah nama netral untuk budaya Prancis, dan fr-FR merupakan nama budaya Prancis (Prancis) tertentu. Perhatikan bahwa bahasa Tionghoa (Sederhana) dan Tionghoa (Tradisional) juga dianggap sebagai budaya netral.

Membuat instans CompareInfo kelas untuk budaya netral tidak disarankan karena data yang dikandungnya bersifat arbitrer. Untuk menampilkan dan mengurutkan data, tentukan bahasa dan wilayah. Selain itu, Name properti objek yang CompareInfo dibuat untuk budaya netral hanya mengembalikan negara dan tidak menyertakan wilayah tersebut.

Budaya yang ditentukan memiliki hierarki di mana induk budaya tertentu adalah budaya netral dan induk budaya netral adalah budaya invarian. Properti Parent ini berisi budaya netral yang terkait dengan budaya tertentu. Budaya kustom harus menentukan Parent properti sesuai dengan pola ini.

Jika sumber daya untuk budaya tertentu tidak tersedia dalam sistem operasi, sumber daya untuk budaya netral terkait digunakan. Jika sumber daya untuk budaya netral tidak tersedia, sumber daya yang disematkan di perakitan utama digunakan. Untuk informasi selengkapnya tentang proses fallback sumber daya, lihat Mengemas dan Menyebarkan Sumber Daya.

Daftar lokal di Windows API sedikit berbeda dari daftar budaya yang didukung oleh .NET. Jika interoperabilitas dengan Windows diperlukan, misalnya, melalui mekanisme p/invoke, aplikasi harus menggunakan budaya tertentu yang ditentukan untuk sistem operasi. Penggunaan budaya tertentu memastikan konsistensi dengan lokal Windows yang setara, yang diidentifikasi dengan pengidentifikasi lokal yang sama dengan LCID.

A DateTimeFormatInfo atau dapat NumberFormatInfo dibuat hanya untuk budaya invarian atau untuk budaya tertentu, bukan untuk budaya netral.

Jika DateTimeFormatInfo.Calendar adalah TaiwanCalendar tetapi Thread.CurrentCulture tidak diatur ke zh-TW, maka DateTimeFormatInfo.NativeCalendarName, DateTimeFormatInfo.GetEraName, dan DateTimeFormatInfo.GetAbbreviatedEraName mengembalikan string kosong ("").

Budaya kustom

Di Windows, Anda dapat membuat lokal kustom. Untuk informasi selengkapnya, lihat Lokal kustom.

CultureInfo dan data budaya

.NET memperoleh data budayanya dari salah satu dari berbagai sumber, tergantung pada implementasi, platform, dan versi:

  • Dalam .NET Framework 3.5 dan versi yang lebih lama, data budaya disediakan oleh sistem operasi Windows dan .NET Framework.

  • Dalam .NET Framework 4 dan versi yang lebih baru, data budaya disediakan oleh sistem operasi Windows.

  • Di semua versi .NET Core yang berjalan di Windows, data budaya disediakan oleh sistem operasi Windows.

  • Di semua versi .NET Core yang berjalan di platform Unix, data budaya disediakan oleh International Components for Unicode (ICU) Library. Versi spesifik Pustaka ICU bergantung pada sistem operasi individual.

Karena itu, budaya yang tersedia pada implementasi, platform, atau versi .NET tertentu mungkin tidak tersedia pada implementasi, platform, atau versi .NET yang berbeda.

Beberapa CultureInfo objek berbeda tergantung pada platform yang mendasar. Secara khusus, zh-CN, atau Cina (Sederhana, Cina) dan zh-TW, atau Cina (Tradisional, Taiwan), tersedia budaya pada sistem Windows, tetapi mereka adalah budaya alias pada sistem Unix. "zh-CN" adalah alias untuk budaya "zh-Hans-CN", dan "zh-TW" adalah alias untuk budaya "zh-Hant-TW". Budaya alias tidak dikembalikan oleh panggilan ke GetCultures metode dan mungkin memiliki nilai properti yang berbeda, termasuk budaya yang berbeda Parent , daripada rekan-rekan Windows mereka. zh-CN Untuk budaya dan zh-TW , perbedaan ini termasuk yang berikut:

  • Pada sistem Windows, budaya induk dari budaya "zh-CN" adalah "zh-Hans", dan budaya induk dari budaya "zh-TW" adalah "zh-Hant". Budaya induk dari kedua budaya ini adalah "zh". Pada sistem Unix, orang tua dari kedua budaya adalah "zh". Ini berarti bahwa, jika Anda tidak menyediakan sumber daya khusus budaya untuk budaya "zh-CN" atau "zh-TW" tetapi menyediakan sumber daya untuk budaya netral "zh-Hans" atau "zh-Hant", aplikasi Anda akan memuat sumber daya untuk budaya netral di Windows tetapi tidak di Unix. Pada sistem Unix, Anda harus secara eksplisit mengatur utas CurrentUICulture ke "zh-Hans" atau "zh-Hant".

  • Pada sistem Windows, memanggil CultureInfo.Equals instans yang mewakili budaya "zh-CN" dan meneruskannya instans true"zh-Hans-CN" mengembalikan . Pada sistem Unix, panggilan metode mengembalikan false. Perilaku ini juga berlaku untuk memanggil Equals instans "zh-TW" CultureInfo dan meneruskannya instans "zh-Hant-Tw".

Data budaya dinamis

Kecuali untuk budaya invarian, data budaya bersifat dinamis. Ini berlaku bahkan untuk budaya yang telah ditentukan sebelumnya. Misalnya, negara atau wilayah mengadopsi mata uang baru, mengubah ejaan kata-kata mereka, atau mengubah kalender pilihan mereka, dan definisi budaya berubah untuk melacak ini. Budaya kustom dapat berubah tanpa pemberitahuan, dan budaya tertentu mungkin ditimpa oleh budaya pengganti kustom. Juga, seperti yang dibahas di bawah ini, pengguna individu dapat mengambil alih preferensi budaya. Aplikasi harus selalu mendapatkan data budaya pada durasi.

Perhatian

Saat menyimpan data, aplikasi Anda harus menggunakan budaya invarian, format biner, atau format independen budaya tertentu. Data yang disimpan sesuai dengan nilai saat ini yang terkait dengan budaya tertentu, selain budaya invarian, mungkin menjadi tidak dapat dibaca atau mungkin berubah artinya jika budaya tersebut berubah.

Budaya saat ini dan budaya UI saat ini

Setiap utas dalam aplikasi .NET memiliki budaya saat ini dan budaya UI saat ini. Budaya saat ini menentukan konvensi pemformatan untuk nilai tanggal, waktu, angka, dan mata uang, urutan teks, konvensi casing, dan cara perbandingan string. Budaya UI saat ini digunakan untuk mengambil sumber daya khusus budaya pada durasi.

Catatan

Untuk informasi tentang bagaimana budaya UI saat ini dan saat ini ditentukan berdasarkan per utas, lihat bagian Budaya dan utas . Untuk informasi tentang bagaimana budaya UI saat ini dan saat ini ditentukan pada utas yang dijalankan di domain aplikasi baru, dan pada utas yang melintasi batas domain aplikasi, lihat bagian Budaya dan domain aplikasi . Untuk informasi tentang bagaimana budaya UI saat ini dan saat ini ditentukan pada utas yang melakukan operasi asinkron berbasis tugas, lihat bagian Budaya dan operasi asinkron berbasis tugas .

Untuk informasi lebih rinci tentang budaya saat ini, lihat CultureInfo.CurrentCulture topik properti. Untuk informasi lebih rinci tentang budaya UI saat ini, lihat CultureInfo.CurrentUICulture topik properti.

Mengambil budaya UI saat ini dan saat ini

Anda bisa mendapatkan CultureInfo objek yang mewakili budaya saat ini dengan salah satu dari dua cara:

Contoh berikut mengambil kedua nilai properti, membandingkannya untuk menunjukkan bahwa nilai tersebut sama, dan menampilkan nama budaya saat ini.

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

public class Example
{
   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
Imports System.Globalization
Imports System.Threading

Module Example
   Public Sub Main()
      Dim culture1 As CultureInfo = CultureInfo.CurrentCulture
      Dim culture2 As CultureInfo = Thread.CurrentThread.CurrentCulture
      Console.WriteLine("The current culture is {0}", culture1.Name)
      Console.WriteLine("The two CultureInfo objects are equal: {0}",
                        culture1.Equals(culture2))
   End Sub
End Module
' The example displays output like the following:
'     The current culture is en-US
'     The two CultureInfo objects are equal: True

Anda bisa mendapatkan CultureInfo objek yang mewakili budaya UI saat ini dengan salah satu dari dua cara:

Contoh berikut mengambil kedua nilai properti, membandingkannya untuk menunjukkan bahwa nilai tersebut sama, dan menampilkan nama budaya UI saat ini.

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

public class Example
{
   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
Imports System.Globalization
Imports System.Threading

Module Example
   Public Sub Main()
      Dim uiCulture1 As CultureInfo = CultureInfo.CurrentUICulture
      Dim uiCulture2 As CultureInfo = Thread.CurrentThread.CurrentUICulture
      Console.WriteLine("The current UI culture is {0}", uiCulture1.Name)
      Console.WriteLine("The two CultureInfo objects are equal: {0}",
                        uiCulture1.Equals(uiCulture2))
   End Sub
End Module
' The example displays output like the following:
'     The current UI culture is en-US
'     The two CultureInfo objects are equal: True

Mengatur budaya UI saat ini dan saat ini

Untuk mengubah budaya dan budaya UI utas, lakukan hal berikut:

  1. CultureInfo Buat instans objek yang mewakili budaya tersebut dengan memanggil CultureInfo konstruktor kelas dan meneruskannya nama budaya. Konstruktor CultureInfo(String) membuat instans CultureInfo objek yang mencerminkan penimpaan pengguna jika budaya baru sama dengan budaya Windows saat ini. CultureInfo(String, Boolean) Konstruktor memungkinkan Anda menentukan apakah objek yang baru dibuat mencerminkan CultureInfo penimpaan pengguna jika budaya baru sama dengan budaya Windows saat ini.

  2. Tetapkan CultureInfo objek ke CultureInfo.CurrentCulture properti atau CultureInfo.CurrentUICulture pada .NET Core dan .NET Framework 4.6 dan versi yang lebih baru. (Pada .NET Framework 4.5.2 dan versi yang lebih lama, Anda dapat menetapkan CultureInfo objek ke Thread.CurrentCulture properti atau Thread.CurrentUICulture .)

Contoh berikut mengambil budaya saat ini. Jika itu selain budaya Prancis (Prancis), itu mengubah budaya saat ini menjadi Prancis (Prancis). Jika tidak, itu mengubah budaya saat ini menjadi Prancis (Luksemburg).

using System;
using System.Globalization;

public class Example
{
   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
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim current As CultureInfo = CultureInfo.CurrentCulture
      Console.WriteLine("The current culture is {0}", current.Name)
      Dim newCulture As CultureInfo
      If current.Name.Equals("fr-FR") Then
         newCulture = New CultureInfo("fr-LU")
      Else   
         newCulture = new CultureInfo("fr-FR")
      End If
      
      CultureInfo.CurrentCulture = newCulture
      Console.WriteLine("The current culture is now {0}", 
                        CultureInfo.CurrentCulture.Name)   
   End Sub
End Module
' The example displays output like the following:
'     The current culture is en-US
'     The current culture is now fr-FR

Contoh berikut mengambil budaya saat ini. Jika itu adalah sesuatu yang lain budaya Slovenia (Slovenia), itu mengubah budaya saat ini menjadi Slovenia (Slovenia). Jika tidak, itu mengubah budaya saat ini menjadi Kroasia (Kroasia).

using System;
using System.Globalization;

public class Example
{
   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
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim current As CultureInfo = CultureInfo.CurrentUICulture
      Console.WriteLine("The current UI culture is {0}", current.Name)
      Dim newUICulture As CultureInfo
      If current.Name.Equals("sl-SI") Then
         newUICulture = New CultureInfo("hr-HR")
      Else   
         newUICulture = new CultureInfo("sl-SI")
      End If
      
      CultureInfo.CurrentUICulture = newUICulture
      Console.WriteLine("The current UI culture is now {0}", 
                        CultureInfo.CurrentUICulture.Name)   
   End Sub
End Module
' The example displays output like the following:
'     The current UI culture is en-US
'     The current UI culture is now sl-SI

Mendapatkan semua budaya

Anda dapat mengambil array kategori budaya tertentu atau dari semua budaya yang tersedia di komputer lokal dengan memanggil GetCultures metode . Misalnya, Anda dapat mengambil budaya kustom, budaya tertentu, atau budaya netral baik sendiri atau dalam kombinasi.

Contoh berikut memanggil GetCultures metode dua kali, pertama dengan System.Globalization.CultureTypes anggota enumerasi untuk mengambil semua budaya kustom, dan kemudian dengan System.Globalization.CultureTypes anggota enumerasi untuk mengambil semua budaya pengganti.

using System;
using System.Globalization;

public class Example
{
   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.
Imports System.Globalization

Module Example
   Public Sub Main()
      ' Get all custom cultures.
      Dim custom() As CultureInfo = CultureInfo.GetCultures(CultureTypes.UserCustomCulture)
      If custom.Length = 0 Then 
         Console.WriteLine("There are no user-defined custom cultures.")
      Else
         Console.WriteLine("Custom cultures:")
         For Each culture In custom 
            Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName)
         Next       
      End If
      Console.WriteLine()
      
      ' Get all replacement cultures.
      Dim replacements() As CultureInfo = CultureInfo.GetCultures(CultureTypes.ReplacementCultures)
      If replacements.Length = 0 Then 
         Console.WriteLine("There are no replacement cultures.")
      Else 
         Console.WriteLine("Replacement cultures:")
         For Each culture in replacements 
            Console.WriteLine("   {0} -- {1}", culture.Name, culture.DisplayName)    
         Next
      End If
      Console.WriteLine()
   End Sub
End Module
' 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.

Budaya dan utas

Ketika utas aplikasi baru dimulai, budayanya saat ini dan budaya UI saat ini didefinisikan oleh budaya sistem saat ini, dan bukan oleh budaya utas saat ini. Contoh berikut mengilustrasikan perbedaannya. Ini menetapkan budaya saat ini dan budaya UI saat ini dari utas aplikasi ke budaya Prancis (Prancis) (fr-FR). Jika budaya saat ini sudah fr-FR, contohnya menetapkannya ke budaya Inggris (Amerika Serikat) (en-US). Ini menampilkan tiga angka acak sebagai nilai mata uang dan kemudian membuat utas baru, yang, pada gilirannya, menampilkan tiga angka acak lagi sebagai nilai mata uang. Tetapi seperti yang ditunjukkan oleh output dari contoh, nilai mata uang yang ditampilkan oleh utas baru tidak mencerminkan konvensi pemformatan budaya Prancis (Prancis), tidak seperti output dari utas aplikasi utama.

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

public class Example
{
   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
Imports System.Globalization
Imports System.Threading

Module Example
   Dim rnd As New Random()
   
   Public Sub Main()
      If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
         ' 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")
      End If
      ThreadProc()
          
       Dim worker As New Thread(AddressOf ThreadProc)
       worker.Name = "WorkerThread"
       worker.Start()
   End Sub
   
   Private Sub DisplayThreadInfo()
      Console.WriteLine()
      Console.WriteLine("Current Thread Name: '{0}'", 
                        Thread.CurrentThread.Name)
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name)                        
   End Sub
   
   Private Sub DisplayValues()
      ' Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:")
      For ctr As Integer = 0 To 3
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10)                        
      Next
   End Sub
   
   Private Sub ThreadProc()
      DisplayThreadInfo()
      DisplayValues()
   End Sub
End Module
' 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

Dalam versi .NET Framework sebelum .NET Framework 4.5, cara paling umum untuk memastikan bahwa utas aplikasi utama memiliki budaya yang sama dengan semua utas pekerja lainnya adalah dengan meneruskan nama budaya di seluruh aplikasi atau CultureInfo objek yang mewakili budaya di seluruh aplikasi kepada System.Threading.ParameterizedThreadStart delegasi. Contoh berikut menggunakan pendekatan ini untuk memastikan bahwa nilai mata uang yang ditampilkan oleh dua utas mencerminkan konvensi pemformatan dari budaya yang sama.

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

public class Example
{
   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");
      }
      DisplayThreadInfo();
      DisplayValues();

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

   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(Object obj)
   {
      Thread.CurrentThread.CurrentCulture = (CultureInfo) obj;
      Thread.CurrentThread.CurrentUICulture = (CultureInfo) obj;
      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 €
Imports System.Globalization
Imports System.Threading

Module Example
   Dim rnd As New Random()
   
   Public Sub Main()
      If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
         ' 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")
      End If
      DisplayThreadInfo()
      DisplayValues()
          
       Dim worker As New Thread(AddressOf ThreadProc)
       worker.Name = "WorkerThread"
       worker.Start(Thread.CurrentThread.CurrentCulture)
   End Sub
   
   Private Sub DisplayThreadInfo()
      Console.WriteLine()
      Console.WriteLine("Current Thread Name: '{0}'", 
                        Thread.CurrentThread.Name)
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name)                        
   End Sub
   
   Private Sub DisplayValues()
      ' Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:")
      For ctr As Integer = 0 To 3
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10)                        
      Next
   End Sub
   
   Private Sub ThreadProc(obj As Object)
      Thread.CurrentThread.CurrentCulture = CType(obj, CultureInfo)
      Thread.CurrentThread.CurrentUICulture = CType(obj, CultureInfo)
      DisplayThreadInfo()
      DisplayValues()
   End Sub
End Module
' 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 €

Anda dapat mengatur budaya dan budaya UI dari utas kumpulan utas dengan cara yang sama dengan memanggil ThreadPool.QueueUserWorkItem(WaitCallback, Object) metode .

Dimulai dengan .NET Framework 4.5, Anda dapat mengatur budaya dan budaya UI dari semua utas dalam domain aplikasi secara lebih langsung dengan menetapkan CultureInfo objek yang mewakili budaya tersebut DefaultThreadCurrentCulture ke properti dan DefaultThreadCurrentUICulture . Contoh berikut menggunakan properti ini untuk memastikan bahwa semua utas di domain aplikasi default memiliki budaya yang sama.

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

public class Example
{
   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(Example.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 €
Imports System.Globalization
Imports System.Threading

Module Example
   Dim rnd As New Random()
   
   Public Sub Main()
      If Thread.CurrentThread.CurrentCulture.Name <> "fr-FR" Then
         ' 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")
      End If
      ThreadProc()

       Dim worker As New Thread(AddressOf ThreadProc)
       worker.Name = "WorkerThread"
       worker.Start()
   End Sub
   
   Private Sub DisplayThreadInfo()
      Console.WriteLine()
      Console.WriteLine("Current Thread Name: '{0}'", 
                        Thread.CurrentThread.Name)
      Console.WriteLine("Current Thread Culture/UI Culture: {0}/{1}", 
                        Thread.CurrentThread.CurrentCulture.Name,
                        Thread.CurrentThread.CurrentUICulture.Name)                        
   End Sub
   
   Private Sub DisplayValues()
      ' Create new thread and display three random numbers.
      Console.WriteLine("Some currency values:")
      For ctr As Integer = 0 To 3
         Console.WriteLine("   {0:C2}", rnd.NextDouble() * 10)                        
      Next
   End Sub
   
   Private Sub ThreadProc()
      DisplayThreadInfo()
      DisplayValues()
   End Sub
End Module
' 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 €

Peringatan

DefaultThreadCurrentCulture Meskipun properti dan DefaultThreadCurrentUICulture adalah anggota statis, properti menentukan budaya default dan budaya UI default hanya untuk domain aplikasi yang saat ini pada saat nilai properti ini ditetapkan. Untuk informasi selengkapnya, lihat bagian berikutnya, Budaya dan domain aplikasi.

Ketika Anda menetapkan nilai ke DefaultThreadCurrentCulture properti dan DefaultThreadCurrentUICulture , budaya dan budaya UI utas di domain aplikasi juga berubah jika mereka belum secara eksplisit diberi budaya. Namun, utas ini hanya mencerminkan pengaturan budaya baru saat dijalankan di domain aplikasi saat ini. Jika utas ini dijalankan di domain aplikasi lain, budaya mereka menjadi budaya default yang ditentukan untuk domain aplikasi tersebut. Akibatnya, kami sarankan Anda selalu mengatur budaya utas aplikasi utama, dan tidak bergantung pada DefaultThreadCurrentCulture properti dan DefaultThreadCurrentUICulture untuk mengubahnya.

Domain budaya dan aplikasi

DefaultThreadCurrentCulture dan DefaultThreadCurrentUICulture merupakan properti statis yang secara eksplisit menentukan budaya default hanya untuk domain aplikasi yang saat ini ketika nilai properti diatur atau diambil. Contoh berikut menetapkan budaya default dan budaya UI default di domain aplikasi default ke Prancis (Prancis), lalu menggunakan AppDomainSetup kelas dan AppDomainInitializer delegasi untuk mengatur budaya default dan budaya UI dalam domain aplikasi baru ke Rusia (Rusia). Satu utas kemudian menjalankan dua metode di setiap domain aplikasi. Perhatikan bahwa budaya utas dan budaya UI tidak diatur secara eksplisit; mereka berasal dari budaya default dan budaya UI dari domain aplikasi tempat utas dijalankan. Perhatikan juga bahwa DefaultThreadCurrentCulture properti dan DefaultThreadCurrentUICulture mengembalikan nilai default CultureInfo domain aplikasi yang saat ini saat panggilan metode dilakukan.

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

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
Imports System.Globalization
Imports System.Reflection
Imports System.Threading

Module Example
   Public Sub Main()
      ' Set the default culture and display the current date in the current application domain.
      Dim info1 As New Info()
      SetAppDomainCultures("fr-FR")
      
      ' Create a second application domain.
      Dim setup As New AppDomainSetup()
      setup.AppDomainInitializer = AddressOf SetAppDomainCultures
      setup.AppDomainInitializerArguments = { "ru-RU" }
      Dim domain As AppDomain = AppDomain.CreateDomain("Domain2", Nothing, setup)
      ' Create an Info object in the new application domain.
      Dim info2 As Info = CType(domain.CreateInstanceAndUnwrap(GetType(Example).Assembly.FullName, 
                                                               "Info"), Info) 

      ' Execute methods in the two application domains.
      info2.DisplayDate()
      info2.DisplayCultures()
      
      info1.DisplayDate()
      info1.DisplayCultures()            
   End Sub
   
   Public Sub SetAppDomainCultures(names() As String)
      SetAppDomainCultures(names(0))
   End Sub
   
   Public Sub SetAppDomainCultures(name As String)
       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 e As CultureNotFoundException
         Return
      Catch e As ArgumentException
         Return
      End Try      
   End Sub
End Module

Public Class Info : Inherits MarshalByRefObject
   Public Sub DisplayDate()
      Console.WriteLine("Today is {0:D}", Date.Now)
   End Sub
   
   Public Sub 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)
   End Sub
End Class
' 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

Untuk informasi selengkapnya tentang budaya dan domain aplikasi, lihat bagian "Domain aplikasi dan Utas" di topik Domain Aplikasi .

Budaya dan operasi asinkron berbasis tugas

Pola pemrograman asinkron berbasis tugas menggunakan Task objek dan Task<TResult> untuk menjalankan delegasi secara asinkron pada utas kumpulan utas. Utas spesifik tempat tugas tertentu berjalan tidak diketahui sebelumnya, tetapi hanya ditentukan pada runtime.

Untuk aplikasi yang menargetkan .NET Framework 4.6 atau versi yang lebih baru, budaya adalah bagian dari konteks operasi asinkron. Dengan kata lain, dimulai dengan aplikasi yang menargetkan .NET Framework 4.6, operasi asinkron secara default mewarisi nilai CurrentCulture dan CurrentUICulture properti utas tempat mereka diluncurkan. Jika budaya saat ini atau budaya UI saat ini berbeda dari budaya sistem, budaya saat ini melewati batas utas dan menjadi budaya utas kumpulan utas saat ini yang menjalankan operasi asinkron.

Contoh berikut memberikan ilustrasi sederhana. Ini menggunakan TargetFrameworkAttribute atribut untuk menargetkan .NET Framework 4.6. Contoh mendefinisikan Func<TResult> delegasi, formatDelegate, yang mengembalikan beberapa angka yang diformat sebagai nilai mata uang. Contohnya mengubah budaya sistem saat ini menjadi Prancis (Prancis) atau, jika Prancis (Prancis) sudah menjadi budaya saat ini, Inggris (Amerika Serikat). Kemudian:

  • Memanggil delegasi secara langsung sehingga berjalan secara sinkron pada utas aplikasi utama.

  • Membuat tugas yang menjalankan delegasi secara asinkron pada utas kumpulan utas.

  • Membuat tugas yang menjalankan delegasi secara sinkron pada utas aplikasi utama dengan memanggil Task.RunSynchronously metode .

Seperti yang ditunjukkan oleh output dari contoh, ketika budaya saat ini diubah menjadi Bahasa Prancis (Prancis), budaya utas saat ini tempat tugas dipanggil secara asinkron menjadi budaya saat ini untuk operasi asinkron tersebut.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

[assembly:TargetFramework(".NETFramework,Version=v4.6")]

public class Example
{

   public static void Main()
   {
       decimal[] values = { 163025412.32m, 18905365.59m };
       string formatString = "C2";
       Func<String> formatDelegate = () => { string output = String.Format("Formatting using the {0} culture on thread {1}.\n",
                                                                           CultureInfo.CurrentCulture.Name,
                                                                           Thread.CurrentThread.ManagedThreadId);
                                             foreach (var value in values)
                                                output += String.Format("{0}   ", value.ToString(formatString));

                                             output += Environment.NewLine;
                                             return output;
                                           };

       Console.WriteLine("The example is running on thread {0}",
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}",
                         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 {0}.\n",
                         CultureInfo.CurrentCulture.Name);

       // 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 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks

<Assembly:TargetFramework(".NETFramework,Version=v4.6")>

Module Example
   Public Sub Main()
       Dim values() As Decimal = { 163025412.32d, 18905365.59d }
       Dim formatString As String = "C2"
       Dim formatDelegate As Func(Of String) = Function()
                                                  Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
                                                                                       CultureInfo.CurrentCulture.Name,
                                                                                       Thread.CurrentThread.ManagedThreadId)
                                                  output += Environment.NewLine
                                                  For Each value In values
                                                     output += String.Format("{0}   ", value.ToString(formatString))
                                                  Next 
                                                  output += Environment.NewLine
                                                  Return output
                                               End Function
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If
       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       Console.WriteLine()                  
       
       ' 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:") 
       Dim t1 = Task.Run(formatDelegate)
       Console.WriteLine(t1.Result)
       
       Console.WriteLine("Executing a task synchronously:")
       Dim t2 = New Task(Of String)(formatDelegate) 
       t2.RunSynchronously()
       Console.WriteLine(t2.Result)
   End Sub
End Module
' 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 Imports the fr-FR culture on thread 1.
'          163 025 412,32 €   18 905 365,59 €
'
'          Executing a task asynchronously:
'          Formatting Imports the fr-FR culture on thread 3.
'          163 025 412,32 €   18 905 365,59 €
'
'          Executing a task synchronously:
'          Formatting Imports the fr-FR culture on thread 1.
'          163 025 412,32 €   18 905 365,59 €

Untuk aplikasi yang menargetkan versi .NET Framework sebelum .NET Framework 4.6, atau untuk aplikasi yang tidak menargetkan versi .NET Framework tertentu, budaya utas panggilan bukan bagian dari konteks tugas. Sebaliknya, kecuali satu didefinisikan secara eksplisit, budaya utas baru secara default adalah budaya sistem. Contoh berikut, yang identik dengan contoh sebelumnya kecuali tidak memiliki TargetFrameworkAttribute atribut , mengilustrasikan ini. Karena budaya sistem sistem tempat contoh yang dijalankan adalah bahasa Inggris (Amerika Serikat), budaya tugas yang dijalankan secara asinkron pada utas en-US kumpulan utas bukan fr-FR.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
       decimal[] values = { 163025412.32m, 18905365.59m };
       string formatString = "C2";
       Func<String> formatDelegate = () => { string output = String.Format("Formatting using the {0} culture on thread {1}.\n",
                                                                           CultureInfo.CurrentCulture.Name,
                                                                           Thread.CurrentThread.ManagedThreadId);
                                             foreach (var value in values)
                                                output += String.Format("{0}   ", value.ToString(formatString));

                                             output += Environment.NewLine;
                                             return output;
                                           };

       Console.WriteLine("The example is running on thread {0}",
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}",
                         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 {0}.\n",
                         CultureInfo.CurrentCulture.Name);

       // 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 en-US 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 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
       Dim values() As Decimal = { 163025412.32d, 18905365.59d }
       Dim formatString As String = "C2"
       Dim formatDelegate As Func(Of String) = Function()
                                                  Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
                                                                                       CultureInfo.CurrentCulture.Name,
                                                                                       Thread.CurrentThread.ManagedThreadId)
                                                  output += Environment.NewLine
                                                  For Each value In values
                                                     output += String.Format("{0}   ", value.ToString(formatString))
                                                  Next 
                                                  output += Environment.NewLine
                                                  Return output
                                               End Function
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If
       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       Console.WriteLine()                  
       
       ' 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:") 
       Dim t1 = Task.Run(formatDelegate)
       Console.WriteLine(t1.Result)
       
       Console.WriteLine("Executing a task synchronously:")
       Dim t2 = New Task(Of String)(formatDelegate) 
       t2.RunSynchronously()
       Console.WriteLine(t2.Result)
   End Sub
End Module
' 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 en-US 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 €

Untuk aplikasi yang menargetkan versi .NET Framework dari .NET Framework 4.5 dan yang lebih baru tetapi sebelum .NET Framework 4.6, Anda dapat menggunakan DefaultThreadCurrentCulture properti dan DefaultThreadCurrentUICulture untuk memastikan bahwa budaya utas panggilan digunakan dalam tugas asinkron yang dijalankan pada utas kumpulan utas. Contoh berikut identik dengan contoh sebelumnya, kecuali menggunakan DefaultThreadCurrentCulture properti untuk memastikan bahwa utas kumpulan utas memiliki budaya yang sama dengan utas aplikasi utama.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
       decimal[] values = { 163025412.32m, 18905365.59m };
       string formatString = "C2";
       Func<String> formatDelegate = () => { string output = String.Format("Formatting using the {0} culture on thread {1}.\n",
                                                                           CultureInfo.CurrentCulture.Name,
                                                                           Thread.CurrentThread.ManagedThreadId);
                                             foreach (var value in values)
                                                output += String.Format("{0}   ", value.ToString(formatString));

                                             output += Environment.NewLine;
                                             return output;
                                           };

       Console.WriteLine("The example is running on thread {0}",
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}",
                         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 {0}.\n",
                         CultureInfo.CurrentCulture.Name);
       CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CurrentCulture;

       // 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 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
       Dim values() As Decimal = { 163025412.32d, 18905365.59d }
       Dim formatString As String = "C2"
       Dim formatDelegate As Func(Of String) = Function()
                                                  Dim output As String = String.Format("Formatting using the {0} culture on thread {1}.",
                                                                                       CultureInfo.CurrentCulture.Name,
                                                                                       Thread.CurrentThread.ManagedThreadId)
                                                  output += Environment.NewLine
                                                  For Each value In values
                                                     output += String.Format("{0}   ", value.ToString(formatString))
                                                  Next 
                                                  output += Environment.NewLine
                                                  Return output
                                               End Function
       
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If
       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CurrentCulture
       Console.WriteLine()                  
       
       ' 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:") 
       Dim t1 = Task.Run(formatDelegate)
       Console.WriteLine(t1.Result)
       
       Console.WriteLine("Executing a task synchronously:")
       Dim t2 = New Task(Of String)(formatDelegate) 
       t2.RunSynchronously()
       Console.WriteLine(t2.Result)
   End Sub
End Module
' 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 dan DefaultThreadCurrentUICulture merupakan properti domain per aplikasi; yaitu, mereka membangun budaya default untuk semua utas yang tidak secara eksplisit menetapkan budaya di domain aplikasi tertentu. Namun, untuk aplikasi yang menargetkan .NET Framework 4.6 atau yang lebih baru, budaya utas panggilan tetap menjadi bagian dari konteks tugas asinkron meskipun tugas melewati batas domain aplikasi.

Contoh berikut menunjukkan bahwa budaya utas panggilan tetap menjadi budaya saat ini dari operasi asinkron berbasis tugas bahkan jika metode yang dijalankan tugas melewati batas domain aplikasi. Ini mendefinisikan kelas, DataRetriever, dengan satu metode, GetFormattedNumber, yang mengembalikan angka floating-point presisi ganda acak antara 1 dan 1.000 yang diformat sebagai nilai mata uang. Tugas pertama dijalankan yang hanya membuat instans DataRetriever dan memanggil metodenya GetFormattedNumber . Tugas kedua melaporkan domain aplikasinya saat ini, membuat domain aplikasi baru, membuat DataRetriever instans di domain aplikasi baru, dan memanggil metodenya GetFormattedNumber . Seperti yang ditunjukkan oleh output dari contoh, budaya saat ini tetap sama dalam utas panggilan, tugas pertama, dan tugas kedua baik ketika dijalankan di domain aplikasi utama dan domain aplikasi kedua.

using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

[assembly:TargetFramework(".NETFramework,Version=v4.6")]

public class Example
{
   public static void Main()
   {
       string formatString = "C2";
       Console.WriteLine("The example is running on thread {0}",
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}",
                         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 {0}.\n",
                         CultureInfo.CurrentCulture.Name);

       // Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously in the main appdomain:");
       var t1 = Task.Run(() => { DataRetriever d = new DataRetriever();
                                 return d.GetFormattedNumber(formatString);
                               });
       Console.WriteLine(t1.Result);
       Console.WriteLine();

       Console.WriteLine("Executing a task synchronously in two appdomains:");
       var t2 = Task.Run(() => { Console.WriteLine("Thread {0} is running in app domain '{1}'",
                                                   Thread.CurrentThread.ManagedThreadId,
                                                   AppDomain.CurrentDomain.FriendlyName);
                                 AppDomain domain = AppDomain.CreateDomain("Domain2");
                                 DataRetriever d = (DataRetriever) domain.CreateInstanceAndUnwrap(typeof(Example).Assembly.FullName,
                                                   "DataRetriever");
                                 return d.GetFormattedNumber(formatString);
                               });
       Console.WriteLine(t2.Result);
   }
}

public class DataRetriever : MarshalByRefObject
{
   public string GetFormattedNumber(String format)
   {
      Thread thread = Thread.CurrentThread;
      Console.WriteLine("Current culture is {0}", thread.CurrentCulture);
      Console.WriteLine("Thread {0} is running in app domain '{1}'",
                        thread.ManagedThreadId,
                        AppDomain.CurrentDomain.FriendlyName);
      Random rnd = new Random();
      Double value = rnd.NextDouble() * 1000;
      return value.ToString(format);
   }
}
// The example displays output like the following:
//     The example is running on thread 1
//     The current culture is en-US
//     Changed the current culture to fr-FR.
//
//     Executing a task asynchronously in a single appdomain:
//     Current culture is fr-FR
//     Thread 3 is running in app domain 'AsyncCulture4.exe'
//     93,48 €
//
//     Executing a task synchronously in two appdomains:
//     Thread 4 is running in app domain 'AsyncCulture4.exe'
//     Current culture is fr-FR
//     Thread 4 is running in app domain 'Domain2'
//     288,66 €
Imports System.Globalization
Imports System.Runtime.Versioning
Imports System.Threading
Imports System.Threading.Tasks

<Assembly:TargetFramework(".NETFramework,Version=v4.6")>

Module Example
   Public Sub Main()
       Dim formatString As String = "C2"
       Console.WriteLine("The example is running on thread {0}", 
                         Thread.CurrentThread.ManagedThreadId)
       ' Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}", 
                         CultureInfo.CurrentCulture.Name)
       If CultureInfo.CurrentCulture.Name = "fr-FR" Then
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
       Else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
       End If

       Console.WriteLine("Changed the current culture to {0}.",
                         CultureInfo.CurrentCulture.Name)
       Console.WriteLine()
       
       ' Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously in the main appdomain:") 
       Dim t1 = Task.Run(Function()
                            Dim d As New DataRetriever()
                            Return d.GetFormattedNumber(formatString)
                         End Function)
       Console.WriteLine(t1.Result)
       Console.WriteLine() 
       
       Console.WriteLine("Executing a task synchronously in two appdomains:")
       Dim t2 = Task.Run(Function()
                            Console.WriteLine("Thread {0} is running in app domain '{1}'", 
                                              Thread.CurrentThread.ManagedThreadId, 
                                              AppDomain.CurrentDomain.FriendlyName)
                            Dim domain As AppDomain = AppDomain.CreateDomain("Domain2")
                            Dim d As DataRetriever = CType(domain.CreateInstanceAndUnwrap(GetType(Example).Assembly.FullName,
                                                                                          "DataRetriever"), DataRetriever)
                            Return d.GetFormattedNumber(formatString) 
                         End Function) 
       Console.WriteLine(t2.Result)
   End Sub
End Module

Public Class DataRetriever : Inherits MarshalByRefObject
   Public Function GetFormattedNumber(format As String) As String
      Dim thread As Thread = Thread.CurrentThread
      Console.WriteLine("Current culture is {0}", thread.CurrentCulture)
      Console.WriteLine("Thread {0} is running in app domain '{1}'", 
                        thread.ManagedThreadId, 
                        AppDomain.CurrentDomain.FriendlyName)
      Dim rnd As New Random()
      Dim value As Double = rnd.NextDouble() * 1000
      Return value.ToString(format)
   End Function
End Class
' The example displays output like the following:
'     The example is running on thread 1
'     The current culture is en-US
'     Changed the current culture to fr-FR.
'     
'     Executing a task asynchronously in a single appdomain:
'     Current culture is fr-FR
'     Thread 3 is running in app domain 'AsyncCulture4.exe'
'     93,48 €
'     
'     Executing a task synchronously in two appdomains:
'     Thread 4 is running in app domain 'AsyncCulture4.exe'
'     Current culture is fr-FR
'     Thread 4 is running in app domain 'Domain2'
'     288,66 €

Serialisasi objek CultureInfo

CultureInfo Ketika objek diserialisasikan, semua yang benar-benar disimpan adalah Name dan UseUserOverride. Ini berhasil dideserialisasi hanya di lingkungan di mana yang Name memiliki arti yang sama. Tiga contoh berikut menunjukkan mengapa ini tidak selalu terjadi:

  • CultureTypes Jika nilai properti adalah CultureTypes.InstalledWin32Cultures, dan jika budaya tersebut pertama kali diperkenalkan dalam versi tertentu dari sistem operasi Windows, tidak mungkin untuk mendeserialisasinya pada versi Windows yang lebih lama. Misalnya, jika budaya diperkenalkan dalam Windows 10, itu tidak dapat dideserialisasi pada Windows 8.

  • CultureTypes Jika nilainya adalah CultureTypes.UserCustomCulture, dan komputer tempatnya dideserialisasi tidak menginstal budaya kustom pengguna ini, tidak dimungkinkan untuk mendeserialisasinya.

  • CultureTypes Jika nilainya adalah CultureTypes.ReplacementCultures, dan komputer yang deserialisasinya tidak memiliki budaya pengganti ini, ia mendeserialisasi ke nama yang sama, tetapi tidak semua karakteristik yang sama. Misalnya, jika en-US adalah budaya pengganti pada komputer A, tetapi tidak di komputer B, dan jika objek yang CultureInfo mengacu pada budaya ini diserialisasikan pada komputer A dan dideserialisasi pada komputer B, maka tidak ada karakteristik kustom budaya yang ditransmisikan. Budaya deserialisasi berhasil, tetapi dengan arti yang berbeda.

penimpaan Panel Kontrol

Pengguna dapat memilih untuk mengambil alih beberapa nilai yang terkait dengan budaya Windows saat ini melalui bagian opsi regional dan bahasa dari Panel Kontrol. Misalnya, pengguna dapat memilih untuk menampilkan tanggal dalam format yang berbeda atau menggunakan mata uang selain default untuk budaya. Secara umum, aplikasi Anda harus mematuhi penimpaan pengguna ini.

Jika UseUserOverride adalah true dan budaya yang ditentukan cocok dengan budaya Windows saat ini, menggunakan penimpaan tersebut CultureInfo , termasuk pengaturan pengguna untuk properti DateTimeFormatInfo instans yang dikembalikan oleh DateTimeFormat properti , dan properti NumberFormatInfo instans yang dikembalikan oleh NumberFormat properti . Jika pengaturan pengguna tidak kompatibel dengan budaya yang terkait dengan CultureInfo, misalnya, jika kalender yang dipilih bukan salah satu dari OptionalCalendars, hasil metode dan nilai properti tidak terdefinisi.

Urutan pengurutan alternatif

Beberapa budaya mendukung lebih dari satu urutan sortir. Contohnya:

  • Budaya Spanyol (Spanyol) memiliki dua urutan sortir: urutan sortir internasional default, dan urutan sortir tradisional. Ketika Anda membuat CultureInfo instans objek dengan es-ES nama budaya, urutan sortir internasional digunakan. Saat Anda membuat instans CultureInfo objek dengan es-ES-tradnl nama budaya, urutan sortir tradisional digunakan.

  • Budaya zh-CN (Tionghoa (Sederhana, RRT)) mendukung dua urutan sort: dengan pengucapan (default) dan dengan jumlah stroke. Saat Anda membuat instans CultureInfo objek dengan zh-CN nama budaya, urutan pengurutan default digunakan. Saat Anda membuat CultureInfo instans objek dengan pengidentifikasi lokal 0x00020804, string diurutkan berdasarkan jumlah goresan.

Tabel berikut ini mencantumkan budaya yang mendukung urutan pengurutan alternatif dan pengidentifikasi untuk urutan pengurutan default dan alternatif.

Nama kultur Kultur Nama dan pengidentifikasi pengurutan default Nama dan pengidentifikasi pengurutan alternatif
es-ES Spanyol (Spanyol) Internasional: 0x00000C0A Tradisional: 0x0000040A
zh-TW China (Taiwan) Jumlah Stroke: 0x00000404 Bopomofo: 0x00030404
zh-CN Tionghoa (RRT) Pengucapan: 0x00000804 Jumlah Stroke: 0x00020804
zh-HK China (SAR Hong Kong) Jumlah Stroke: 0x00000c04 Jumlah Stroke: 0x00020c04
zh-SG Bahasa Tionghoa (Singapura) Pengucapan: 0x00001004 Jumlah Stroke: 0x00021004
zh-MO Bahasa Mandarin (Macau SAR) Pengucapan: 0x00001404 Jumlah Stroke: 0x00021404
ja-JP Jepang (Jepang) Default: 0x00000411 Unicode: 0x00010411
ko-KR Korea (Korea) Default: 0x00000412 Xwansung Korea - Unicode: 0x00010412
de-DE Bahasa Jerman (Jerman) Kamus: 0x00000407 Buku Telepon Sortir DIN: 0x00010407
hu-HU Bahasa Hungaria (Hungaria) Default: 0x0000040e Pengurutan Teknis: 0x0001040e
ka-GE Georgia (Georgia) Tradisional: 0x00000437 Pengurutan Modern: 0x00010437

Budaya saat ini dan aplikasi UWP

Di aplikasi Platform Windows Universal (UWP), CurrentCulture properti dan CurrentUICulture bersifat baca-tulis, sama seperti yang ada di aplikasi .NET Framework dan .NET Core. Namun, aplikasi UWP mengenali satu budaya. Properti CurrentCulture dan CurrentUICulture memetakan ke nilai pertama dalam koleksi Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages .

Dalam aplikasi .NET Framework dan .NET Core, budaya saat ini adalah pengaturan per utas, dan CurrentCulture properti dan CurrentUICulture mencerminkan budaya dan budaya UI dari utas saat ini saja. Di aplikasi UWP, budaya saat ini memetakan ke koleksi Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages , yang merupakan pengaturan global. CurrentCulture Mengatur properti atau CurrentUICulture mengubah budaya seluruh aplikasi; budaya tidak dapat diatur berdasarkan per utas.

Konstruktor

CultureInfo(Int32)

Menginisialisasi instans CultureInfo baru kelas berdasarkan budaya yang ditentukan oleh pengidentifikasi budaya.

CultureInfo(Int32, Boolean)

Menginisialisasi instans CultureInfo baru kelas berdasarkan budaya yang ditentukan oleh pengidentifikasi budaya dan pada nilai yang menentukan apakah akan menggunakan pengaturan budaya yang dipilih pengguna dari Windows.

CultureInfo(String)

Menginisialisasi instans CultureInfo baru kelas berdasarkan budaya yang ditentukan berdasarkan nama.

CultureInfo(String, Boolean)

Menginisialisasi instans CultureInfo baru kelas berdasarkan budaya yang ditentukan oleh nama dan pada nilai yang menentukan apakah akan menggunakan pengaturan budaya yang dipilih pengguna dari Windows.

Properti

Calendar

Mendapatkan kalender default yang digunakan oleh budaya.

CompareInfo

CompareInfo Mendapatkan yang menentukan cara membandingkan string untuk budaya.

CultureTypes

Mendapatkan jenis budaya yang berkaitan dengan objek saat ini CultureInfo .

CurrentCulture

Mendapatkan atau mengatur CultureInfo objek yang mewakili budaya yang digunakan oleh utas saat ini dan operasi asinkron berbasis tugas.

CurrentUICulture

Mendapatkan atau mengatur CultureInfo objek yang mewakili budaya antarmuka pengguna saat ini yang digunakan oleh Resource Manager untuk mencari sumber daya khusus budaya pada durasi.

DateTimeFormat

Mendapatkan atau mengatur DateTimeFormatInfo yang mendefinisikan format yang sesuai secara budaya untuk menampilkan tanggal dan waktu.

DefaultThreadCurrentCulture

Mendapatkan atau mengatur budaya default untuk utas di domain aplikasi saat ini.

DefaultThreadCurrentUICulture

Mendapatkan atau mengatur budaya UI default untuk utas di domain aplikasi saat ini.

DisplayName

Mendapatkan nama budaya lengkap yang dilokalkan.

EnglishName

Mendapatkan nama budaya dalam format languagefull [country/regionfull] dalam bahasa Inggris.

IetfLanguageTag

Dihentikan. Mendapatkan identifikasi standar RFC 4646 untuk bahasa.

InstalledUICulture

CultureInfo Mendapatkan yang mewakili budaya yang diinstal dengan sistem operasi.

InvariantCulture

CultureInfo Mendapatkan objek yang independen budaya (invarian).

IsNeutralCulture

Mendapatkan nilai yang menunjukkan apakah saat ini CultureInfo mewakili budaya netral.

IsReadOnly

Mendapatkan nilai yang menunjukkan apakah saat ini CultureInfo bersifat baca-saja.

KeyboardLayoutId

Mendapatkan pengidentifikasi lokal input aktif.

LCID

Mendapatkan pengidentifikasi budaya untuk saat ini CultureInfo.

Name

Mendapatkan nama budaya dalam format languagecode2-country/regioncode2.

NativeName

Mendapatkan nama budaya, yang terdiri dari bahasa, negara/wilayah, dan skrip opsional, yang diatur ke budaya untuk ditampilkan.

NumberFormat

Mendapatkan atau mengatur NumberFormatInfo yang mendefinisikan format yang sesuai secara budaya untuk menampilkan angka, mata uang, dan persentase.

OptionalCalendars

Mendapatkan daftar kalender yang dapat digunakan oleh budaya.

Parent

CultureInfo Mendapatkan yang mewakili budaya induk dari saat ini CultureInfo.

TextInfo

TextInfo Mendapatkan yang mendefinisikan sistem penulisan yang terkait dengan budaya.

ThreeLetterISOLanguageName

Mendapatkan kode tiga huruf ISO 639-2 untuk bahasa saat ini CultureInfo.

ThreeLetterWindowsLanguageName

Mendapatkan kode tiga huruf untuk bahasa seperti yang didefinisikan dalam Windows API.

TwoLetterISOLanguageName

Mendapatkan kode tiga huruf ISO 639-1 atau ISO 639-3 untuk bahasa pemrogram saat ini CultureInfo.

UseUserOverride

Mendapatkan nilai yang menunjukkan apakah objek saat ini CultureInfo menggunakan pengaturan budaya yang dipilih pengguna.

Metode

ClearCachedData()

Menyegarkan informasi terkait budaya yang di-cache.

Clone()

Membuat salinan dari saat ini CultureInfo.

CreateSpecificCulture(String)

CultureInfo Membuat yang mewakili budaya tertentu yang terkait dengan nama yang ditentukan.

Equals(Object)

Menentukan apakah objek yang ditentukan adalah budaya yang sama dengan saat ini CultureInfo.

GetConsoleFallbackUICulture()

Mendapatkan budaya antarmuka pengguna alternatif yang cocok untuk aplikasi konsol ketika budaya antarmuka pengguna grafis default tidak cocok.

GetCultureInfo(Int32)

Mengambil instans budaya baca-saja yang di-cache dengan menggunakan pengidentifikasi budaya yang ditentukan.

GetCultureInfo(String)

Mengambil instans budaya baca-saja yang di-cache menggunakan nama budaya yang ditentukan.

GetCultureInfo(String, Boolean)

Mengambil instans budaya yang di-cache dan baca-saja.

GetCultureInfo(String, String)

Mengambil instans budaya yang di-cache dan baca-saja. Parameter menentukan budaya yang diinisialisasi dengan TextInfo objek dan CompareInfo yang ditentukan oleh budaya lain.

GetCultureInfoByIetfLanguageTag(String)

Dihentikan. Mengambil objek baca-saja CultureInfo yang memiliki karakteristik linguistik yang diidentifikasi oleh tag bahasa RFC 4646 yang ditentukan.

GetCultures(CultureTypes)

Mendapatkan daftar budaya yang didukung yang difilter oleh parameter yang ditentukan CultureTypes .

GetFormat(Type)

Mendapatkan objek yang menentukan cara memformat jenis yang ditentukan.

GetHashCode()

Berfungsi sebagai fungsi hash untuk saat ini CultureInfo, cocok untuk algoritma hash dan struktur data, seperti tabel hash.

GetType()

Mendapatkan dari instans Type saat ini.

(Diperoleh dari Object)
MemberwiseClone()

Membuat salinan dangkal dari saat ini Object.

(Diperoleh dari Object)
ReadOnly(CultureInfo)

Mengembalikan pembungkus baca-saja di sekitar objek yang ditentukan CultureInfo .

ToString()

Mengembalikan string yang berisi nama saat ini CultureInfo dalam format languagecode2-negara/regioncode2.

Berlaku untuk

Lihat juga