本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语

CultureInfo 类

 

提供有关特定区域性的信息 (称为区域设置对于非托管的代码开发)。 这些信息包括区域性的名称、书写系统、使用的日历、字符串的排序顺序以及对日期和数字的格式化设置。

命名空间:   System.Globalization
程序集:  mscorlib(位于 mscorlib.dll)

System.Object
  System.Globalization.CultureInfo

[SerializableAttribute]
[ComVisibleAttribute(true)]
public class CultureInfo : ICloneable, IFormatProvider

名称说明
System_CAPS_pubmethodCultureInfo(Int32)

根据区域性标识符指定的区域性初始化 CultureInfo 类的新实例。

System_CAPS_pubmethodCultureInfo(Int32, Boolean)

基于区域性标识符指定的区域性并基于布尔值(指定是否使用系统中用户选定的区域性设置)来初始化 CultureInfo 类的新实例。

System_CAPS_pubmethodCultureInfo(String)

根据由名称指定的区域性初始化 CultureInfo 类的新实例。

System_CAPS_pubmethodCultureInfo(String, Boolean)

基于名称指定的区域性并基于布尔值(指定是否使用系统中用户选定的区域性设置)来初始化 CultureInfo 类的新实例。

名称说明
System_CAPS_pubpropertyCalendar

获取区域性使用的默认日历。

System_CAPS_pubpropertyCompareInfo

获取为区域性定义如何比较字符串的 CompareInfo

System_CAPS_pubpropertyCultureTypes

获取属于当前 CultureInfo 对象的区域性类型。

System_CAPS_pubpropertySystem_CAPS_staticCurrentCulture

获取表示当前线程使用的区域性的 CultureInfo 对象。

System_CAPS_pubpropertySystem_CAPS_staticCurrentUICulture

获取或设置 CultureInfo 对象,该对象表示资源管理器在运行时查找区域性特定资源时所用的当前用户接口区域性。

System_CAPS_pubpropertyDateTimeFormat

获取或设置 DateTimeFormatInfo,它定义适合区域性的、显示日期和时间的格式。

System_CAPS_pubpropertySystem_CAPS_staticDefaultThreadCurrentCulture

获取或设置当前应用程序域中线程的默认区域性。

System_CAPS_pubpropertySystem_CAPS_staticDefaultThreadCurrentUICulture

获取或设置当前应用程序域中线程的默认 UI 区域性。

System_CAPS_pubpropertyDisplayName

获取完整的本地化区域性名称。

System_CAPS_pubpropertyEnglishName

获取格式为 languagefull [country/regionfull] 的英语区域性名称。

System_CAPS_pubpropertyIetfLanguageTag

已否决。 获取某种语言的 RFC 4646 标准标识。

System_CAPS_pubpropertySystem_CAPS_staticInstalledUICulture

获取表示操作系统中安装的区域性的 CultureInfo

System_CAPS_pubpropertySystem_CAPS_staticInvariantCulture

获取不依赖于区域性(固定)的 CultureInfo 对象。

System_CAPS_pubpropertyIsNeutralCulture

获取一个值,该值指示当前 CultureInfo 是否表示非特定区域性。

System_CAPS_pubpropertyIsReadOnly

获取一个值,该值指示当前 CultureInfo 是否为只读。

System_CAPS_pubpropertyKeyboardLayoutId

获取活动的输入区域设置标识符。

System_CAPS_pubpropertyLCID

获取当前 CultureInfo 的区域性标识符。

System_CAPS_pubpropertyName

获取格式为 languagecode2-country/regioncode2 的区域性名称。

System_CAPS_pubpropertyNativeName

获取为区域性设置的显示名称,它由语言、国家/地区以及可选脚本组成。

System_CAPS_pubpropertyNumberFormat

获取或设置 NumberFormatInfo,它定义适合区域性的、显示数字、货币和百分比的格式。

System_CAPS_pubpropertyOptionalCalendars

获取该区域性可使用的日历的列表。

System_CAPS_pubpropertyParent

获取表示当前 CultureInfo 的父区域性的 CultureInfo

System_CAPS_pubpropertyTextInfo

获取定义与区域性关联的书写体系的 TextInfo

System_CAPS_pubpropertyThreeLetterISOLanguageName

获取当前 CultureInfo 的语言的由三个字母构成的 ISO 639-2 代码。

System_CAPS_pubpropertyThreeLetterWindowsLanguageName

获取 Windows API 中定义的由三个字母构成的语言代码。

System_CAPS_pubpropertyTwoLetterISOLanguageName

获取当前 CultureInfo 的语言的由两个字母构成的 ISO 639-1 代码。

System_CAPS_pubpropertyUseUserOverride

获取一个值,该值指示当前 CultureInfo 对象是否使用用户选定的区域性设置。

名称说明
System_CAPS_pubmethodClearCachedData()

刷新缓存的区域性相关信息。

System_CAPS_pubmethodClone()

创建当前 CultureInfo 的副本。

System_CAPS_pubmethodSystem_CAPS_staticCreateSpecificCulture(String)

创建表示与指定名称关联的特定区域性的 CultureInfo

System_CAPS_pubmethodEquals(Object)

确定指定的对象是否与当前 CultureInfo 具有相同的区域性。(覆盖 Object.Equals(Object)。)

System_CAPS_protmethodFinalize()

在垃圾回收将某一对象回收前允许该对象尝试释放资源并执行其他清理操作。(继承自 Object。)

System_CAPS_pubmethodGetConsoleFallbackUICulture()

如果默认的图形用户界面区域性不合适,则获取适合控制台应用程序的备用用户界面区域性。

System_CAPS_pubmethodSystem_CAPS_staticGetCultureInfo(Int32)

使用特定的区域性标识符检索某个区域性的缓存的只读实例。

System_CAPS_pubmethodSystem_CAPS_staticGetCultureInfo(String)

使用特定的区域性名称检索某个区域性的缓存的只读实例。

System_CAPS_pubmethodSystem_CAPS_staticGetCultureInfo(String, String)

检索某个区域性的缓存的只读实例。 参数指定了一个使用 TextInfoCompareInfo 对象进行初始化的区域性,而这些对象则是由另一个区域性指定的。

System_CAPS_pubmethodSystem_CAPS_staticGetCultureInfoByIetfLanguageTag(String)

已否决。 检索只读的 CultureInfo 对象,其语言特征由指定的 RFC 4646 语言标记标识。

System_CAPS_pubmethodSystem_CAPS_staticGetCultures(CultureTypes)

获取由指定 CultureTypes 参数筛选的支持的区域性列表。

System_CAPS_pubmethodGetFormat(Type)

获取一个定义如何格式化指定类型的对象。

System_CAPS_pubmethodGetHashCode()

用作当前 CultureInfo 的哈希函数,适合用在哈希算法和数据结构(如哈希表)中。(覆盖 Object.GetHashCode()。)

System_CAPS_pubmethodGetType()

获取当前实例的 Type(继承自 Object。)

System_CAPS_protmethodMemberwiseClone()

创建当前 Object 的浅表副本。(继承自 Object。)

System_CAPS_pubmethodSystem_CAPS_staticReadOnly(CultureInfo)

返回指定的 CultureInfo 对象周围的只读包装。

System_CAPS_pubmethodToString()

返回一个字符串,该字符串包含当前 CultureInfo 的名称,其格式为 languagecode2-country/regioncode2(覆盖 Object.ToString()。)

System_CAPS_note说明

若要查看此类型的.NET Framework 源代码,请参阅Reference Source 你可以浏览源代码联机,请下载离线查看的引用并在调试; 过程中逐步执行源 (包括修补程序和更新)see instructions.

CultureInfo类提供区域性特定信息,如语言、 子语言、 国家/地区、 日历和与特定区域性的约定。 此类还提供对区域性特定的实例访问DateTimeFormatInfoNumberFormatInfoCompareInfo,和TextInfo对象。 这些对象包含特定于区域性的操作,如大小写、 格式化日期和数字和比较字符串所需的信息。 CultureInfo类直接或间接类使用的格式、 分析,或处理特定于区域性的数据,如StringDateTimeDateTimeOffset,与数值类型。

本节内容:

区域性名称和标识符
固定,非特定,和特定区域性
自定义区域性
动态区域性数据
当前区域性和当前 UI 区域性
获取所有区域性
区域性和线程
区域性和应用程序域
区域性和基于任务的异步操作
CultureInfo 对象序列化
控制面板重写
替换排序顺序
区域性和 Windows 应用程序

CultureInfo类指定对于每个区域性,根据 RFC 4646 的唯一名称。 名称是一个与语言相关的 ISO 639 两个字母小写区域性代码以及与国家 / 地区关联的 ISO 3166 双字母大写子区域性代码组合。 此外,对于面向的应用.NET Framework 4或更高版本和在 Windows 10 或更高版本,对应于有效 bcp-47 语言标记受支持的区域性名称运行。

System_CAPS_note说明

当区域性名称传递给类构造函数或方法如CreateSpecificCultureCultureInfo,其大小写并不重要。

根据 RFC 4646 的区域性名称的格式是languagecode21>-country/regioncode2,其中languagecode2是两个字母的语言代码和country/regioncode2是两个字母子区域性代码。 示例包括 JA-JP EN-US 日语 (日本) 以及为英语 (美国)。 在两个字母的语言代码不可用的情况下,使用派生自 ISO 639-2 的三个字母代码。

请注意,某些区域性名称还指定 ISO 15924 书写符号。 例如,符号指定西里尔文的脚本和 Latn 指定拉丁脚本。 包含的脚本的区域性名称使用模式languagecode2-scripttag-country/regioncode2 这种类型的区域性名称的一个示例是 uz 符号-UZ 为乌兹别克语 (西里尔文,乌兹别克斯坦)。 在 Windows Vista 之前的 Windows 操作系统,包括脚本的区域性名称使用模式languagecode2-country/regioncode2-scripttag,例如,uz UZ-符号的乌兹别克语 (西里尔文,乌兹别克斯坦)。

只有两个字母小写语言代码指定非特定区域性。 例如,fr 为法语指定非特定区域性和 de 代表德语指定非特定区域性。

System_CAPS_note说明

有两个不符合此规则的区域性名称。 中文 (简体),名为中文-Hans 和中文 (繁体),名为此不同的区域性是非特定区域性。 区域性名称表示当前的标准,并且应能除非你有使用较旧名称 ZH-CHS 和 ZH-CHT 的原因。

区域性标识符是标准的国际号码缩写,具有唯一标识一个已安装的区域性所必需的组件。 你的应用程序可以使用预定义的区域性标识符,或定义自定义的标识符。

某些预定义的区域性名称和标识符由这和中的其他类System.Globalization命名空间。 详细的区域性信息将出现在National Language Support (NLS) API Reference转全局开发人员中心。

请记住的区域性名称和标识符表示找不到特定计算机的区域性的一个子集。 Windows 版本或 service pack 可以更改的可用的区域性。 应用程序添加自定义区域性使用CultureAndRegionInfoBuilder类。 用户将添加使用 Microsoft 区域设置生成器工具自己自定义区域性。 Microsoft 区域设置生成器编写在托管的代码中使用CultureAndRegionInfoBuilder类。

多个不同的名称是该区域性中值得注意的是与下面的类成员关联的名称与紧密关联︰

区域性通常分为三个集合︰ 固定区域性、 非特定区域性和特定区域性。

固定区域性是不区分区域性的。 你的应用程序指定固定区域性的名称,使用空字符串 ("") 或由其标识符。 InvariantCulture定义固定区域性的实例。 关联与英语语言,但不是能与任何国家/地区。 在几乎任何方法中使用Globalization要求区域性的命名空间。

非特定区域性是一个相关联的区域性了一种语言,但不是能与国家/地区。 特定区域性是一个与一种语言和国家/地区关联的区域性。 例如,fr 是对于法语区域性中,非特定语言的名称和 FR-FR 是特定的法语 (法国) 区域性的名称。 请注意,中文 (简体) 和中文 (繁体) 也将被视为非特定区域性。

创建的实例CompareInfo建议不要非特定区域性,因为它包含的数据是任意类。 若要显示和对数据进行排序,指定的语言和区域。 此外,Name属性CompareInfo创建非特定区域性返回仅在国家/地区,并且不包含区域的对象。

定义的区域性具有层次结构中的特定区域性的父是非特定区域性和非特定区域性的父级是固定的区域性。 Parent属性包含与特定区域性关联的非特定区域性。 自定义区域性应Parent符合此模式的属性。

如果特定区域性的资源不在操作系统中可用,使用关联的非特定区域性的资源。 如果非特定区域性的资源不可用,将使用嵌入到主程序集中的资源。 资源回退进程的详细信息,请参阅打包和部署桌面应用程序中的资源

Windows API 中的区域设置的列表是略有不同的.NET Framework 支持的区域性列表。 如果与 Windows 互操作性是必需的例如,通过 p/invoke 机制中,应用程序应使用特定区域性定义的操作系统。 使用特定区域性,可以确保与等效的 Windows 区域设置,会使用相同的区域设置标识符来标识保持一致LCID

ADateTimeFormatInfoNumberFormatInfo只能用于固定区域性或特定区域性 (而不能为非特定区域性) 可以创建。

如果DateTimeFormatInfo.CalendarTaiwanCalendarThread.CurrentCulture未设置为 ZH-TW,然后DateTimeFormatInfo.NativeCalendarNameDateTimeFormatInfo.GetEraName,和DateTimeFormatInfo.GetAbbreviatedEraName返回空字符串 ("")。

除了 Windows 操作系统和.NET Framework 支持的预定义区域性,.NET Framework 支持三种类型的自定义区域性︰

  • 新补充 Windows 或.NET Framework 中可用的区域性的区域性。 例如,应用程序无法安装CultureInfo表示 FJ-FJ (或 Fijan (斐济)) 区域性的系统上的对象。

  • 替换区域性所其属性不同于 Windows 和.NET Framework 支持的标准区域性的属性。

  • 通过用户重写的标准区域性。 用户可以使用地区和语言应用程序中控制面板以自定义现有区域性的属性值。

System_CAPS_note说明

你可以使用CultureAndRegionInfoBuilder类来定义、 保存和注册自定义区域性补充或替换现有的区域性。 CultureAndRegionInfoBuilder.Save方法创建可以用于在目标系统上安装一个自定义区域性的区域设置数据标记语言 (LDML) 文件。 有关分步步骤使用信息CultureAndRegionInfoBuilder创建新的类或替换区域性,请参阅CultureAndRegionInfoBuilder类主题。

由于.NET Framework 支持自定义区域性,你应使用特定于区域性的数据时考虑以下︰

  • 自定义区域性可以具有超过预定义的区域性的范围的值。 例如,某些区域性具有极长的月份名称、 意外的日期或时间格式或其他不常见的数据。

  • 当用户界面中显示特定于区域性的数据时,应遵守用户的自定义项;例如,用户可能需要 24 小时制或者 yyyyMMdd 日期格式。

  • 请记住,自定义区域性会重写默认值。 因此,你不能考虑区域性数据保持不变。 国家/地区名称、 数字和日期格式和拼写在将来可能会更改。 如果你想要序列化 (如日期和时间字符串) 传递给日期和时间分析函数的区分区域性的数据,应使用固定区域性或特定。

CultureTypes属性值的自定义区域性的系统上安装包括CultureTypes.UserCustomCulture分配标志和自定义区域性LCID属性值LOCALE_CUSTOM_UNSPECIFIED(0x1000 或 4096)。 请注意,从 Windows 10 开始,此值还将分配给缺少完整区域性的数据的系统定义的区域性。

固定区域性,除区域性数据是动态的。 这是 true,即使对于的预定义区域性。 例如,国家或地区采用新货币、 更改其单词的拼写或更改首选的日历,而区域性定义更改跟踪。 自定义区域性可能有所更改,恕不另行通知,并通过自定义的替换区域性中任何特定区域性可能会被覆盖。 此外,按如下所述,单个用户可以重写区域性首选项。 应用程序应始终在运行时获取区域性数据。

System_CAPS_caution小心

保存数据时,你的应用程序应使用固定区域性、 二进制格式或特定于区域性的格式。 根据特定区域性,而非固定区域性,与关联的当前值保存的数据可能会变得不可读,或如果该区域性更改可能会更改中的含义。

.NET Framework 应用程序中的每个线程都具有当前区域性和当前的 UI 区域性。 当前区域性的日期、 时间、 数字和货币值、 文本、 大小写约定和比较字符串的方式的排序顺序确定的格式设置约定。 当前 UI 区域性用于检索在运行时的区域性特定资源。

System_CAPS_note说明

有关如何将当前和当前 UI 区域性确定基于每个线程的信息,请参阅区域性和线程部分。 了解如何将当前和当前 UI 区域性确定线程上执行一个新的应用程序域中和跨应用程序域边界的线程上请参阅区域性和应用程序域节。 有关如何执行基于任务的异步操作的线程上确定当前和当前的信息,请参阅区域性和基于任务的异步操作部分。

有关详细的当前区域性的信息,请参阅CultureInfo.CurrentCulture属性主题。 有关详细的当前 UI 区域性的信息,请参阅CultureInfo.CurrentUICulture属性主题。

你可以获取CultureInfo对象,表示当前区域性中两种方法之一︰

下面的示例检索这两个属性值,将它们以显示它们相等,并显示当前区域性的名称进行比较。

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

你可以获取CultureInfo对象,表示当前 UI 区域性中两种方法之一︰

下面的示例检索这两个属性值,将它们以显示它们相等,并显示当前 UI 区域性的名称进行比较。

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

若要更改的区域性和 UI 线程区域性,请执行以下操作︰

  1. 实例化CultureInfo对象通过调用表示该区域性CultureInfo类构造函数并将其传递的区域性名称。 CultureInfo(String)构造函数实例化CultureInfo如果新区域性等同于当前的 Windows 区域性,将重写反映用户的对象。 CultureInfo(String, Boolean)构造函数,可指定是否新实例化CultureInfo对象反映是否新区域性等同于当前的 Windows 区域性,将重写用户。

  2. 分配CultureInfo对象传递给Thread.CurrentCultureThread.CurrentUICulture属性。 此外,对于版本 4.6 或更高版本的桌面的.NET Framework 上运行的应用程序,你还可以分配CultureInfo对象传递给CultureInfo.CurrentCultureCultureInfo.CurrentUICulture属性。

下面的示例检索当前区域性。 如果它是法语 (法国) 区域性之外的任何内容,但它会将当前区域性更改为法语 (法国)。 否则,它将当前区域性更改为法语 (卢森堡)。

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

下面的示例检索当前区域性。 如果它是任何其他斯洛文尼亚语 (斯洛文尼亚) 区域性中,它将当前区域性更改为斯洛文尼亚语 (斯洛文尼亚)。 否则,它将当前区域性更改为克罗地亚语 (克罗地亚)。

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

你可以通过调用检索数组特定的类别或在本地计算机上可用的所有区域性的区域性GetCultures方法。 例如,你可以检索自定义区域性、 特定区域性或非特定区域性,单独使用或组合中。

下面的示例调用GetCultures方法两次,第一个具有CultureTypes.UserCustomCulture枚举成员,以检索所有自定义区域性,且然后CultureTypes.ReplacementCultures要检索所有替换区域性的枚举成员。

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.

当启动新的应用程序线程时,其当前区域性和当前 UI 区域性定义由当前系统区域性,而不是当前线程区域性。 以下示例演示了差异。 它的当前区域性和设置的一个应用程序线程的当前 UI 区域性为法语 (法国) 区域性 (FR-FR)。 如果当前区域性已 FR-FR,则会将其设置为英语 (美国) 区域性 (EN-US)。 它显示为货币值的三个随机数字,然后创建一个新线程,后者反过来,将三个更随机数字显示为货币值。 但作为的示例所示的输出,显示新线程的货币值不能反映的法语 (法国) 区域性,与主应用程序线程的输出不同的格式设置约定。

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

在之前的.NET framework 的版本.NET Framework 4.5、 最常用的方法,以确保主应用程序线程与所有其他工作线程共享相同的区域性是将整个应用程序范围区域性名称传递或CultureInfo对象,表示整个应用程序范围区域性System.Threading.ParameterizedThreadStart委托。 下面的示例使用此方法以确保显示由两个线程的货币值反映相同的区域性的格式设置约定。

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 €

你可以设置区域性和 UI 区域性的线程池线程类似的方式通过调用ThreadPool.QueueUserWorkItem(WaitCallback, Object)方法。

从开始.NET Framework 4.5,你可以设置区域性和 UI 区域性所有线程的应用程序域中更直接通过分配CultureInfo对象,表示该区域性DefaultThreadCurrentCultureDefaultThreadCurrentUICulture属性。 下面的示例使用这些属性以确保默认应用程序域中的所有线程都共享相同的区域性。

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 €
System_CAPS_warning警告

尽管DefaultThreadCurrentCultureDefaultThreadCurrentUICulture属性都是静态成员,他们会定义的默认区域性和仅对是在设置这些属性值时最新的应用程序域的默认 UI 区域性。 有关详细信息,请参阅下一部分中,区域性和应用程序域

将分配到的值时DefaultThreadCurrentCultureDefaultThreadCurrentUICulture属性、 区域性和 UI 区域性的应用程序域中的线程还更改如果它们不显式分配了区域性。 但是,这些线程反映新的区域性设置,仅当它们在当前的应用程序域中执行时。 如果在另一个应用程序域中执行这些线程,其区域性将成为为该应用程序域定义的默认区域性。 因此,建议你始终将主应用程序线程的区域性设置并不依赖于DefaultThreadCurrentCultureDefaultThreadCurrentUICulture属性来更改它。

DefaultThreadCurrentCultureDefaultThreadCurrentUICulture是显式定义仅时设置或检索属性值的当前的应用程序域的默认区域性的静态属性。 下面的示例将默认应用程序域中的默认区域性和默认 UI 区域性设置为法语 (法国),然后使用AppDomainSetup类和AppDomainInitializer委托将新的应用程序域中的默认区域性和 UI 区域性设置为俄语 (俄罗斯)。 单个线程然后执行每个应用程序域中的两种方法。 请注意,线程的区域性和 UI 区域性没有显式设置;它们派生而来的默认区域性和 UI 区域性的线程正在执行的应用程序域。 另请注意,DefaultThreadCurrentCultureDefaultThreadCurrentUICulture属性返回的默认CultureInfo是进行方法调用时当前的应用程序域的值。

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

有关区域文化和应用程序域的详细信息,请参阅主题中的"应用程序域和线程"部分。

基于任务的异步编程模式使用TaskTask<TResult>异步执行委托的对象的线程池线程。 在其运行特定任务的特定线程提前,不知道,但只能在运行时确定。

对于面向的应用.NET Framework 4.6或更高版本,区域性是异步操作的上下文的一部分。 换而言之,从应用开始面向.NET Framework 4.6,异步操作,默认情况下的继承的值CurrentCultureCurrentUICulture程序在启动时的线程的属性。 如果当前区域性或当前 UI 区域性不同于系统区域性,当前区域性跨线程边界的部署,将执行异步操作的线程池线程的当前区域性。

下面的示例提供了简单的演示。 它使用TargetFrameworkAttribute特性应用到目标.NET Framework 4.6。 该示例定义了Func<TResult>委托, formatDelegate,返回一些数字,格式化为货币值。 该示例将当前的系统区域性更改为 French (France) 或者法语 (法国) 已为当前区域性,英语 (美国)。 然后它︰

  • 直接调用的委托,以便它在主应用程序线程上同步运行。

  • 创建一个线程池线程异步执行委托的任务。

  • 创建一个任务,该委托线程上同步执行主应用程序通过调用Task.RunSynchronously方法。

如示例输出所示,当前区域性更改为法语 (法国) 时任务以异步方式调用从中的线程的当前区域性将成为该异步操作的当前区域性。

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 �

对于面向.NET Framework,之前版本的应用, .NET Framework 4.6,或者对于不面向特定版本的.NET framework 的应用程序,调用线程的区域性不是任务的上下文的一部分。 相反,除非已显式定义,默认情况下的新线程的区域性是系统区域性。 以下示例中,这是与前面的示例相同,只不过它缺少TargetFrameworkAttribute特性,阐释了这一点。 执行该示例的系统区域性为英语 (美国),因为在线程池线程上异步执行的任务的区域性是系统的 EN-US,而不是系统的 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 �

从.NET Framework 目标版本的应用.NET Framework 4.5和更高版本,但之前.NET Framework 4.6,你可以使用DefaultThreadCurrentCultureDefaultThreadCurrentUICulture属性,以确保调用线程的区域性用于在线程执行的异步任务池线程。 下面的示例是前面的示例相同,但它使用DefaultThreadCurrentCulture属性以确保该线程池线程具有与主应用程序线程相同的区域性。

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 �

DefaultThreadCurrentCultureDefaultThreadCurrentUICulture是每个应用程序域属性; 即,它们建立默认区域性,所有线程未显式分配的区域性特定的应用程序域中。 但是,对于面向的应用.NET Framework 4.6或更高版本,调用线程的区域性保持异步任务的上下文的一部分,即使是跨应用程序域边界的任务。

下面的示例演示调用线程的区域性保持当前区域性的基于任务的异步操作,即使在执行任务的方法是跨应用程序域边界。 它定义了一个类DataRetriever,与一个方法, GetFormattedNumber,介于 1 和 1000 格式化为货币值之间返回一个随机的双精度浮点数。 第一个任务运行,只需实例化DataRetriever实例并调用其GetFormattedNumber方法。 第二个任务报告其当前的应用程序域、 创建新的应用程序域、 实例化DataRetriever实例中新的应用程序域,并调用其GetFormattedNumber方法。 如示例输出所示,当前区域性一直在调用线程,第一个任务和第二个任务都相同当它在执行主要应用程序域和第二个应用程序域中时。

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 �

CultureInfo序列化对象时,所有实际存储是NameUseUserOverride 它是已成功执行反序列仅在环境中化其中的Name具有相同的含义。 下面的三个示例演示这为什么不是始终这种情况︰

  • 如果CultureTypes属性值是CultureTypes.WindowsOnlyCultures,并且如果在 Windows Vista 或更高版本的 Windows 操作系统中首次引入该区域性不可能进行反 Windows XP 上序列化。 同样,如果在 Windows XP Service Pack 2 中首次引入区域性不能以反序列化 Windows XP 系统尚未在其上安装的区域性。

  • 如果CultureTypes值是CultureTypes.UserCustomCulture,并在其正在执行反序列化的计算机没有安装此用户自定义区域性,不能进行反序列化。

  • 如果CultureTypes值是CultureTypes.ReplacementCultures,并在其正在执行反序列化的计算机不具有此替换区域性,其反序列化为相同的名称,但不是所有相同的特征。 例如,如果 EN-US 替换区域性在计算机 A,但不是能在计算机 B,并且CultureInfo对象引用此区域性是在计算机 A 上序列化和反序列化︰ 计算机 B,然后无区域性的自定义特征进行传输。 区域性反序列化成功,但具有不同的含义。

用户可以选择重写某些与 Windows 通过控制面板的区域和语言选项部分中的当前区域性关联的值。 例如,用户可以选择以不同格式显示日期,或使用区域性而不是默认货币。 一般情况下,你的应用程序应遵循这些用户重写。

如果UseUserOverridetrue和指定的区域性匹配的 Windows 中,当前区域性CultureInfo使用上述重写值,其中包括的属性的用户设置DateTimeFormatInfo返回实例DateTimeFormat属性和的属性NumberFormatInfo返回实例NumberFormat属性。 如果用户设置均与关联的区域性不兼容CultureInfo,例如,如果所选的日历不是一个OptionalCalendars,这些方法的结果和属性的值是不确定。

某些区域性支持多个排序顺序。 例如:

  • 西班牙语 (西班牙) 区域性都有两种排序顺序︰ 默认的国际排序顺序,以及的传统的排序顺序。 当实例化CultureInfo对象 ES-ES 区域性名称,则使用国际排序顺序。 当实例化CultureInfo对象为 es ES tradnl 区域性名称,则使用传统的排序顺序。

  • ZH-CN (中文 (简体,中国)) 区域性支持两种排序顺序︰ 按发音 (默认值) 和按笔画数。 当实例化CultureInfo对象 ZH-CN 区域性名称,则使用默认排序顺序。 当实例化CultureInfo对象 0x00020804,本地标识符的字符串排序按笔画数。

下表列出了支持的默认实例和替换排序顺序的替换排序顺序和标识符的区域性。

区域性名称

区域性

默认排序名称和标识符

替换排序名称和标识符

es-ES

西班牙语(西班牙)

国际︰ 0x00000C0A

传统︰ 0x0000040A

zh-TW

中文 (台湾)

笔画︰ 0x00000404

注音︰ 0x00030404

zh-CN

中文 (中华人民共和国)

发音︰ 0x00000804

笔画︰ 0x00020804

zh-HK

中文(香港特别行政区)

笔画︰ 0x00000c04

笔画︰ 0x00020c04

中文 SG

中文 (新加坡)

发音︰ 0x00001004

笔画︰ 0x00021004

中文 MO

中文 (中国澳门特别行政区)

发音︰ 0x00001404

笔画︰ 0x00021404

ja-JP

日语(日本)

默认︰ 0x00000411

Unicode: 0x00010411

ko-KR

朝鲜语(韩国)

默认︰ 0x00000412

朝鲜语 Xwansung-Unicode: 0x00010412

de-DE

德语(德国)

字典︰ 0x00000407

电话薄排序 DIN: 0x00010407

HU-HU、

匈牙利语(匈牙利)

默认︰ 0x0000040e

技术排序︰ 0x0001040e

ka GE

格鲁吉亚语(格鲁吉亚)

传统︰ 0x00000437

现代排序︰ 0x00010437

在 Windows 应用中,CurrentCultureCurrentUICulture属性是只读的。 可以通过使用 Windows 中设置的当前区域性和当前 UI 区域性ResourceContext.Languages属性。 下面的示例使用它来更改应用程序的当前区域性和当前 UI 区域性为英语 (美国) 或如果当前区域性已为英语 (美国),为法语 (法国)。CurrentCultureCurrentUICulture属性将显示到TextBlock控件名为block 如示例输出所示,这两个属性值反映的新值ResourceContext.Languages属性。


ResourceContext context = ResourceManager.Current.DefaultContext;
var list = new List<String>();
if (CultureInfo.CurrentCulture.Name == "en-US")
   list.Add("fr-FR");
else
   list.Add("en-US");

context.Languages = list;
block.Text += String.Format("\nThe current culture is {0}\n",
                            CultureInfo.CurrentCulture);
block.Text += String.Format("The current culture UI is {0}\n",
                            CultureInfo.CurrentUICulture);
// The example displays output like the following if run on a system
// whose current culture is English (United States):
// The current culture is fr-FR
// The current UI culture is fr-FR   


Dim context As ResourceContext = ResourceManager.Current.DefaultContext
Dim list As New List(Of String)()
If CultureInfo.CurrentCulture.Name = "en-US" Then
   list.Add("fr-FR")
Else
   list.Add("en-US")
End If
context.Languages = list
block.Text += String.Format("{1}The current culture is {0}{1}",
                            CultureInfo.CurrentCulture, vbCrLf)
block.Text += String.Format("The current culture UI is {0}\n",
                            CultureInfo.CurrentUICulture)
' The example displays output Like the following if run on a system
' whose current culture Is English (United States):
'    The current culture Is fr-FR
'    The current UI culture Is fr-FR   

下面的示例演示如何创建CultureInfo西班牙语 (西班牙) 使用国际排序和另一个对象CultureInfo使用传统的排序的对象。

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

*/

通用 Windows 平台
自 8 起可用
.NET Framework
自 1.1 起可用
可移植类库
可移植 .NET 平台 中受支持
Silverlight
自 2.0 起可用
Windows Phone Silverlight
自 7.0 起可用
Windows Phone
自 8.1 起可用

此类型的所有公共静态(Visual Basic 中的 已共享 在 Visual Basic 中)成员都是线程安全的。不保证所有实例成员都是线程安全的。

返回页首
显示: