CultureInfo Class

Определение

Предоставляет сведения об определенном языке и региональных параметрах (которые в совокупности называются языковым стандартом для разработки неуправляемого кода). Provides information about a specific culture (called a locale for unmanaged code development). Эти сведения включают имена языков и региональных параметров, систему письма, используемый календарь, порядок сортировки строк и форматы дат и чисел. The information includes the names for the culture, the writing system, the calendar used, the sort order of strings, and formatting for dates and numbers.

[System.Runtime.InteropServices.ComVisible(true)]
[Serializable]
public class CultureInfo : ICloneable, IFormatProvider
Наследование
CultureInfo
Атрибуты
ComVisibleAttribute SerializableAttribute
Реализации

Примеры

В следующем примере показано, как создать CultureInfo объект для Испанский (Испания) с международная сортировка, а вторая CultureInfo объект с традиционная сортировка.The following example shows how to create a CultureInfo object for Spanish (Spain) with the international sort and another CultureInfo object with the traditional sort.

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
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 'Main 



'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

Комментарии

CultureInfo Класс предоставляет зависящие от культуры сведения, такие как язык, варианта языка, страны или региона, календарь и соглашения, связанные с определенной культуры.The CultureInfo class provides culture-specific information, such as the language, sublanguage, country/region, calendar, and conventions associated with a particular culture. Этот класс также предоставляет доступ к экземплярам региональных DateTimeFormatInfo, NumberFormatInfo, CompareInfo, и TextInfo объектов.This class also provides access to culture-specific instances of the DateTimeFormatInfo, NumberFormatInfo, CompareInfo, and TextInfo objects. Эти объекты содержат сведения, необходимые для конкретного языка и региональных параметров операций, таких как регистр, форматирование дат и чисел и сравнения строк.These objects contain the information required for culture-specific operations, such as casing, formatting dates and numbers, and comparing strings. CultureInfo Класс используется прямо или косвенно с помощью классов, форматирования и синтаксического анализа управления данные, зависящие от языка и региональных параметров, таких как String, DateTime, DateTimeOffsetи числовых типов.The CultureInfo class is used either directly or indirectly by classes that format, parse, or manipulate culture-specific data, such as String, DateTime, DateTimeOffset, and the numeric types.

СодержаниеIn this section:

Язык и региональные параметры имена и идентификаторы Culture names and identifiers
Неизменяемое, нейтральные и конкретные языки и региональные параметры Invariant, neutral, and specific cultures
Пользовательские языки и региональные параметры Custom cultures
Данные динамического языка и региональных параметров Dynamic culture data
Текущий язык и региональные параметры текущего пользовательского интерфейса The current culture and current UI culture
Получение всех языков и региональных параметров Getting all cultures
Язык и региональные параметры и потоков Culture and threads
Язык и региональные параметры и приложения доменов Culture and application domains
Язык и региональные параметры и асинхронные операции на основе задач Culture and task-based asynchronous operations
Сериализация объектов CultureInfo CultureInfo object serialization
Переопределяет панели управления Control Panel overrides
Альтернативные порядки сортировки Alternate sort orders
Приложения для языка и региональных параметров и WindowsCulture and Windows apps

Язык и региональные параметры имена и идентификаторыCulture names and identifiers

CultureInfo Класс указывает уникальное имя для каждой культуры, в соответствии с RFC 4646.The CultureInfo class specifies a unique name for each culture, based on RFC 4646. Имя представляет собой сочетание код ISO 639 двух букв нижнего регистра, языка и региональных параметров, связанных с языком и код двух букв верхнего регистра субкультуры ISO 3166, связанный со страной или регионом.The name is a combination of an ISO 639 two-letter lowercase culture code associated with a language and an ISO 3166 two-letter uppercase subculture code associated with a country or region. Кроме того, для приложений, предназначенных для .NET Framework 4.NET Framework 4 или более поздней версии и работают в Windows 10 или более поздней версии, языка и региональных параметров имена, которые соответствуют допустимого языка BCP-47, теги поддерживаются.In addition, for apps that target .NET Framework 4.NET Framework 4 or later and are running under Windows 10 or later, culture names that correspond to valid BCP-47 language tags are supported.

Примечание

Когда имя языка и региональных параметров передается в конструктор класса или метода например CreateSpecificCulture или CultureInfo, его регистр не имеет значения.When a culture name is passed to a class constructor or a method such as CreateSpecificCulture or CultureInfo, its case is not significant.

Формат имени языка и региональных параметров, в соответствии с RFC 4646 является languagecode2>-country/regioncode2, где languagecode2 — код языка двухбуквенный и country/regioncode2 — код субкультуры двух букв.The format for the culture name based on RFC 4646 is languagecode2>-country/regioncode2, where languagecode2 is the two-letter language code and country/regioncode2 is the two-letter subculture code. Примеры включают ja-JP для японского (Япония) "и" en US для английского языка (США).Examples include ja-JP for Japanese (Japan) and en-US for English (United States). В случаях, где язык двухбуквенный код недоступен используется трехбуквенный код, производный от ISO 639-2.In cases where a two-letter language code is not available, a three-letter code derived from ISO 639-2 is used.

Обратите внимание на то, что некоторые имена языка и региональных параметров также указать стандарту ISO 15924.Note that some culture names also specify an ISO 15924 script. Например Cyrl означает кириллицу с указанием Latn латинского алфавита.For example, Cyrl specifies the Cyrillic script and Latn specifies the Latin script. Имя языка и региональных параметров, которое включает в себя сценарий использует шаблон languagecode2-scripttag-country/regioncode2.A culture name that includes a script uses the pattern languagecode2-scripttag-country/regioncode2. Примером такого рода имя языка и региональных параметров является uz-Cyrl-UZ для Узбекский (кириллица, Узбекистан).An example of this type of culture name is uz-Cyrl-UZ for Uzbek (Cyrillic, Uzbekistan). В операционных системах Windows до Windows Vista, имя языка и региональных параметров, которое включает в себя сценарий использует шаблон languagecode2-country/regioncode2 - * scripttag*, например uz-UZ-Cyrl для Узбекский (кириллица, Узбекистан).On Windows operating systems before Windows Vista, a culture name that includes a script uses the pattern languagecode2-country/regioncode2-scripttag, for example, uz-UZ-Cyrl for Uzbek (Cyrillic, Uzbekistan).

Нейтральная культура определяется только двух букв нижнего регистра кодировку.A neutral culture is specified by only the two-letter lowercase language code. Например fr определяет нейтральный язык и региональные параметры для французского языка, с указанием de нейтральный язык и региональные параметры для немецкого языка.For example, fr specifies the neutral culture for French, and de specifies the neutral culture for German.

Примечание

Существуют два имени языка и региональных параметров, которые соответствуют этому правилу.There are two culture names that contradict this rule. Языки и региональные параметры, с именем zh-Hans, китайский (упрощенное письмо) и китайский (традиционный), с именем zh-Hant, являются нейтральными.The cultures Chinese (Simplified), named zh-Hans, and Chinese (Traditional), named zh-Hant, are neutral cultures. Эти имена представляют текущий стандарт и должен использоваться, если у вас нет причин для использования более старые имена zh-CHS и zh-CHT.The culture names represent the current standard and should be used unless you have a reason for using the older names zh-CHS and zh-CHT.

Идентификатор языка и региональных параметров имеет стандартное международное числовое обозначение и компоненты, необходимые для уникальной идентификации один из установленных языков и региональных параметров.A culture identifier is a standard international numeric abbreviation and has the components necessary to uniquely identify one of the installed cultures. Приложения можно использовать стандартные идентификаторы культуры или определить пользовательские идентификаторы.Your application can use predefined culture identifiers or define custom identifiers.

Некоторые предопределенные имена языка и региональных параметров и идентификаторы используются в этом и других классах System.Globalization пространства имен.Certain predefined culture names and identifiers are used by this and other classes in the System.Globalization namespace. Язык и региональные параметры подробные сведения отображаются на Справочник по API поддержки национальных языков (NLS) в центре разработчиков Go Global.Detailed culture information appears in the National Language Support (NLS) API Reference at the Go Global Developer Center.

Помните, что язык и региональные параметры имена и идентификаторы представляют только подмножество языков и региональных параметров, которые могут находиться на определенном компьютере.Remember that the culture names and identifiers represent only a subset of cultures that can be found on a particular computer. Версии Windows или пакетах обновления можно изменить доступные языки и региональные параметры.Windows versions or service packs can change the available cultures. Приложения, добавить пользовательские языки и региональные параметры с помощью CultureAndRegionInfoBuilder класса.Applications add custom cultures using the CultureAndRegionInfoBuilder class. Пользователи добавлять свои собственные пользовательские языки и региональные параметры с помощью средства Microsoft Locale Builder.Users add their own custom cultures using the Microsoft Locale Builder tool. Microsoft Locale Builder записывается в управляемом коде с помощью CultureAndRegionInfoBuilder класса.Microsoft Locale Builder is written in managed code using the CultureAndRegionInfoBuilder class.

Некоторые особые имена тесно связаны с языком и региональными параметрами, особенно имена, связанные со следующими членами класса:Several distinct names are closely associated with a culture, notably the names associated with the following class members:

Неизменяемое, нейтральные и конкретные языки и региональные параметрыInvariant, neutral, and specific cultures

Языки и региональные параметры делятся на группы по три набора: инвариантные, нейтральные и определенные языки и региональные параметры.The cultures are generally grouped into three sets: invariant cultures, neutral cultures, and specific cultures.

Инвариантный язык и региональные параметры без учета языка и региональных параметров.An invariant culture is culture-insensitive. Приложение указывает инвариантный язык и региональные параметры по имени, используя пустую строку ("») или по его идентификатору.Your application specifies the invariant culture by name using an empty string ("") or by its identifier. InvariantCulture Определяет экземпляр инвариантного языка и региональных параметров.InvariantCulture defines an instance of the invariant culture. Он связан с английским языком, но не с любой страны или региона.It is associated with the English language but not with any country/region. Он используется в практически любом методе в Globalization пространство имен, которое требует языка и региональных параметров.It is used in almost any method in the Globalization namespace that requires a culture.

Нейтральная культура — это культура, связанный с языком, но не со страной или регионом.A neutral culture is a culture that is associated with a language but not with a country/region. Конкретная культура — язык и региональные параметры, который связан с языком и страной или регионом.A specific culture is a culture that is associated with a language and a country/region. Например fr — нейтральный имя для французского языка и региональных параметров и fr-FR, — это имя конкретной культуры французского (Франция).For example, fr is the neutral name for the French culture, and fr-FR is the name of the specific French (France) culture. Обратите внимание на то, что китайский (упрощенное письмо) и китайский (традиционный), также считаются нейтральные культуры.Note that Chinese (Simplified) and Chinese (Traditional) are also considered neutral cultures.

Создание экземпляра CompareInfo класса для нейтрального языка и региональных параметров не рекомендуется, поскольку в нем данных может быть произвольным.Creating an instance of a CompareInfo class for a neutral culture is not recommended because the data it contains is arbitrary. Для отображения и сортировки данных, укажите язык и регион.To display and sort data, specify both the language and region. Кроме того Name свойство CompareInfo объект, созданный для нейтрального языка и региональных параметров возвращает только страны и не включает область.Additionally, the Name property of a CompareInfo object created for a neutral culture returns only the country and does not include the region.

Определенные языки и региональные параметры имеют иерархию, в котором родительского конкретного языка и региональных параметров — это нейтральная культура и инвариантного языка и региональных параметров является родительским для нейтрального языка и региональных параметров.The defined cultures have a hierarchy in which the parent of a specific culture is a neutral culture and the parent of a neutral culture is the invariant culture. Parent Свойство содержит нейтральный язык и региональные параметры, связанные с определенной культуры.The Parent property contains the neutral culture associated with a specific culture. Пользовательские языки и региональные параметры следует определить Parent свойства в соответствии с этим шаблоном.Custom cultures should define the Parent property in conformance with this pattern.

Если ресурсы для конкретного языка и региональных параметров не доступны в операционной системе, используются ресурсы для связанного нейтрального языка и региональных параметров.If the resources for a specific culture are not available in the operating system, the resources for the associated neutral culture are used. Если не доступны ресурсы для нейтрального языка и региональных параметров, используются ресурсы, встроенные в основную сборку.If the resources for the neutral culture are not available, the resources embedded in the main assembly are used. Дополнительные сведения о процесс использования резервных ресурсов, см. в разделе упаковка и развертывание ресурсов.For more information on the resource fallback process, see Packaging and Deploying Resources.

Список языковых стандартов в Windows API немного отличается от списка языков и региональных параметров, поддерживаемых в .NET Framework.The list of locales in the Windows API is slightly different from the list of cultures supported by the .NET Framework. Если требуется взаимодействие с Windows, например, через механизм p/invoke, приложение должно использовать определенного языка и региональных параметров, определенный для операционной системы.If interoperability with Windows is required, for example, through the p/invoke mechanism, the application should use a specific culture that is defined for the operating system. Использование определенного языка и региональных параметров обеспечивает согласованность с эквивалентное языкового стандарта Windows, который определяется идентификатором языкового стандарта, который совпадает со значением LCID.Use of the specific culture ensures consistency with the equivalent Windows locale, which is identified with a locale identifier that is the same as LCID.

Объект DateTimeFormatInfo или NumberFormatInfo могут создаваться только для инвариантного языка и региональных параметров или для конкретных языков и региональных параметров, но не для нейтральной культуры.A DateTimeFormatInfo or a NumberFormatInfo can be created only for the invariant culture or for specific cultures, not for neutral cultures.

Если DateTimeFormatInfo.CalendarTaiwanCalendar , но Thread.CurrentCulture не присвоено значение zh-TW, затем DateTimeFormatInfo.NativeCalendarName, DateTimeFormatInfo.GetEraName, и DateTimeFormatInfo.GetAbbreviatedEraName возвращается пустая строка (»»).If DateTimeFormatInfo.Calendar is the TaiwanCalendar but the Thread.CurrentCulture is not set to zh-TW, then DateTimeFormatInfo.NativeCalendarName, DateTimeFormatInfo.GetEraName, and DateTimeFormatInfo.GetAbbreviatedEraName return an empty string ("").

Пользовательские языки и региональные параметрыCustom cultures

Помимо стандартных языков и региональных параметров, поддерживаемых операционной системы Windows и .NET Framework .NET Framework поддерживает три типа пользовательских языков и региональных параметров:In addition to the predefined cultures supported by the Windows operating system and the .NET Framework, the .NET Framework supports three types of custom cultures:

  • Новые языки и региональные параметры, которые дополняют культур, доступных в Windows или .NET Framework.New cultures that supplement the cultures available in Windows or the .NET Framework. Например, приложение может установить CultureInfo объекта, что представляет fj-FJ (или Fijan (Фиджи)) языка и региональных параметров в системе.For example, an application could install a CultureInfo object that represents the fj-FJ (or Fijan (Fiji)) culture on a system.

  • Языки и региональные параметры замены, свойства которого отличаются от свойств стандартных языков и региональных параметров, поддерживаемых Windows и .NET Framework.Replacement cultures whose properties are different from the properties of the standard cultures supported by Windows and the .NET Framework.

  • Переопределяет стандартные языки и региональные параметры с пользователем.Standard cultures with user overrides. Пользователь может использовать регион и язык приложение панели управления для настройки значений свойств существующего языка и региональных параметров.The user can use the Region and Language application in Control Panel to customize an existing culture's property values.

Примечание

Можно использовать CultureAndRegionInfoBuilder класс для определения, сохранить и зарегистрировать пользовательские языки и региональные параметры, которые дополнить или заменить существующие языки и региональные параметры.You can use the CultureAndRegionInfoBuilder class to define, save, and register custom cultures that either supplement or replace existing cultures. CultureAndRegionInfoBuilder.Save Метод создает файл языка разметки данных языкового стандарта (LDML), который может использоваться для установки пользовательского языка и региональных параметров в целевых системах.The CultureAndRegionInfoBuilder.Save method creates a Locale Data Markup Language (LDML) file that can be used to install a custom culture on target systems. Шаг по шаг сведения об использовании CultureAndRegionInfoBuilder класса для создания нового или замены языка и региональных параметров, см. в разделе CultureAndRegionInfoBuilder разделе, посвященном классу.For step-by step information on using the CultureAndRegionInfoBuilder class to create a new or replacement culture, see the CultureAndRegionInfoBuilder class topic.

Поскольку платформа .NET Framework поддерживает пользовательские языки и региональные параметры, при работе с данными конкретного языка и региональных параметров необходимо учитывать следующее:Because the .NET Framework supports custom cultures, you should consider the following when working with culture-specific data:

  • Пользовательские языки и региональные параметры могут иметь значения, выходить за границы стандартных языков и региональных параметров.Custom cultures can have values that exceed the ranges of the predefined cultures. Например некоторые языки и региональные параметры имеют слишком длинные названия месяцев, Непредвиденная даты или форматы времени или другие нестандартные данные.For example, some cultures have unusually long month names, unexpected date or time formats, or other unusual data.

  • При отображении данные, зависящие от языка и региональных параметров в пользовательском интерфейсе, должен подчиняться настроек пользователя; Например пользователю может потребоваться 24-часовом формате или формате даты ГГГГММДД.When you display culture-specific data in the user interface, you should respect the user's customizations; for example, the user might want a 24-hour clock or a yyyyMMdd date format.

  • Помните, что пользовательские языки и региональные параметры переопределяют значения по умолчанию.Remember that custom cultures override default values. Таким образом нельзя считать данные языка и региональных параметров стабильность.Therefore, you cannot consider culture data to be stable. Названия стран, форматы чисел и дат и вариантов может измениться в будущем.Country names, number and date formats, and spellings may change in the future. Если нужно сериализовать данные, зависящие от языка и региональных параметров таких как строки даты и времени должны быть переданы дату и время, синтаксический анализ функции, следует использовать инвариантного языка и региональных параметров или конкретного.If you want to serialize culture-sensitive data such as date and time strings to be passed to the date and time parsing functions, you should use the invariant culture or a specific .

CultureTypes Включает значение свойства пользовательских языков и региональных параметров, установленной в системе System.Globalization.CultureTypes флаг и пользовательские языки и региональные параметры назначаются LCID значение свойства LOCALE_CUSTOM_UNSPECIFIED (0x1000 или 4096).The CultureTypes property value of custom cultures installed on a system includes the System.Globalization.CultureTypes flag, and custom cultures are assigned an LCID property value of LOCALE_CUSTOM_UNSPECIFIED (0x1000, or 4096). Обратите внимание на то, что, начиная с Windows 10, это значение также назначается системный языков и региональных параметров, которые не хватает полные данные.Note that, starting with Windows 10, this value is also assigned to system-defined cultures that lack complete cultural data.

Данные динамического языка и региональных параметровDynamic culture data

За исключением инвариантного языка и региональных параметров данных языка и региональных параметров является динамическим.Except for the invariant culture, culture data is dynamic. Это справедливо даже для стандартных языков и региональных параметров.This is true even for the predefined cultures. Например стран или регионов ввести новые валюты, изменить написание слов или изменить их основной календарь и изменить определения языка и региональных параметров для отслеживания это.For example, countries or regions adopt new currencies, change their spellings of words, or change their preferred calendar, and culture definitions change to track this. Пользовательские языки и региональные параметры могут быть изменены без предварительного уведомления и любого конкретного языка и региональных параметров может переопределяться пользовательская заменяющая языка и региональных параметров.Custom cultures are subject to change without notice, and any specific culture might be overridden by a custom replacement culture. Кроме того как описано ниже, отдельного пользователя можно переопределить культурные предпочтения.Also, as discussed below, an individual user can override cultural preferences. Приложения всегда должны получать данные языка и региональных параметров во время выполнения.Applications should always obtain culture data at run time.

Внимание!

При сохранении данных, приложение должно использовать инвариантный язык и региональные параметры, двоичный формат или определенном формате независимый от языка и региональных параметров.When saving data, your application should use the invariant culture, a binary format, or a specific culture-independent format. Данные, сохраненные в соответствии с текущего значения, связанные с определенной культуры, отличный от инвариантного языка и региональных параметров, могут стать нечитаемыми, или может измениться в значение, при изменении этого языка и региональных параметров.Data saved according to the current values associated with a particular culture, other than the invariant culture, might become unreadable or might change in meaning if that culture changes.

Текущий язык и региональные параметры текущего пользовательского интерфейсаThe current culture and current UI culture

Каждый поток в приложении .NET Framework имеет текущего языка и региональных параметров и текущий язык и региональные параметры пользовательского интерфейса.Every thread in a .NET Framework application has a current culture and a current UI culture. Текущий язык и региональные параметры определяет соглашения о форматировании для дат, времени, чисел и значения валюты, порядок сортировки текста, соглашения о регистре и способы сравнения строк.The current culture determines the formatting conventions for dates, times, numbers, and currency values, the sort order of text, casing conventions, and the ways in which strings are compared. Текущий язык и региональные параметры пользовательского интерфейса используется для получения от культуры ресурсам во время выполнения.The current UI culture is used to retrieve culture-specific resources at runtime.

Примечание

Сведения об определении текущих и текущей культуре интерфейса пользователя на основе отдельного потока, см. в разделе языка и региональных параметров и потоки раздел.For information on how the current and current UI culture is determined on a per-thread basis, see the Culture and threads section. Сведения об определении текущих и текущего языка пользовательского интерфейса в потоках выполнение в новый домен приложения и в потоках, пересекающих границы домена приложения, см. в разделе языка и региональных параметров и домены приложений раздел.For information on how the current and current UI culture is determined on threads executing in a new application domain, and on threads that cross application domain boundaries, see the Culture and application domains section. Сведения об определении текущего и current в потоках, выполнение асинхронных операций на основе задач, см. в разделе язык и региональные параметры и асинхронные операции на основе задач раздел.For information on how the current and current is determined on threads performing task-based asynchronous operations, see the Culture and task-based asynchronous operations section.

Дополнительные сведения о текущих региональных параметров, см. в разделе CultureInfo.CurrentCulture свойства раздела.For more detailed information on the current culture, see the CultureInfo.CurrentCulture property topic. Дополнительные сведения о текущих региональных параметров пользовательского интерфейса, см. в разделе CultureInfo.CurrentUICulture свойства раздела.For more detailed information on the current UI culture, see the CultureInfo.CurrentUICulture property topic.

Получение текущих и текущего пользовательского интерфейса языков и региональных параметровRetrieving the current and current UI cultures

Вы можете получить CultureInfo , представляющий текущий язык и региональные параметры одним из двух способов:You can get a CultureInfo object that represents the current culture in either of two ways:

Следующий пример извлекает оба значения свойств, сравниваются, чтобы показать, что они равны и отображает имя текущего языка и региональных параметров.The following example retrieves both property values, compares them to show that they are equal, and displays the name of the current culture.

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

Вы можете получить CultureInfo , представляющий текущий язык и региональные параметры пользовательского интерфейса в одном из двух способов:You can get a CultureInfo object that represents the current UI culture in either of two ways:

Следующий пример извлекает оба значения свойств, сравниваются, чтобы показать, что они равны и отображает имя текущего языка и региональных параметров пользовательского интерфейса.The following example retrieves both property values, compares them to show that they are equal, and displays the name of the current UI culture.

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

Настройка региональных параметров пользовательского интерфейса текущей и текущийSetting the current and current UI cultures

Чтобы изменить язык и региональные параметры пользовательского интерфейса потока, сделайте следующее:To change the culture and UI culture of a thread, do the following:

  1. Создать экземпляр CultureInfo объект, представляющий этот язык, вызвав CultureInfo класса конструктор и передав имя языка и региональных параметров.Instantiate a CultureInfo object that represents that culture by calling a CultureInfo class constructor and passing it the name of the culture. CultureInfo(String) Конструктор создает CultureInfo , который отражает пользователя переопределяет Если нового языка и региональных параметров совпадает со значением текущего языка и региональных параметров Windows.The CultureInfo(String) constructor instantiates a CultureInfo object that reflects user overrides if the new culture is the same as the current Windows culture. CultureInfo(String, Boolean) Конструктор позволяет указать ли вновь созданным экземпляром CultureInfo объекта отражает переопределение пользователя, если новый язык и региональные параметры совпадает со значением текущего языка и региональных параметров Windows.The CultureInfo(String, Boolean) constructor allows you to specify whether the newly instantiated CultureInfo object reflects user overrides if the new culture is the same as the current Windows culture.

  2. Назначить CultureInfo объект Thread.CurrentCulture или Thread.CurrentUICulture свойство.Assign the CultureInfo object to the Thread.CurrentCulture or Thread.CurrentUICulture property. Кроме того, для приложения, работающие на версии 4.6 или более поздняя версия классической платформы .NET Framework, можно также назначить CultureInfo объект CultureInfo.CurrentCulture или CultureInfo.CurrentUICulture свойство.In addition, for apps running on the version 4.6 or later of the desktop .NET Framework, you can also assign the CultureInfo object to the CultureInfo.CurrentCulture or CultureInfo.CurrentUICulture property.

В следующем примере извлекается текущего языка и региональных параметров.The following example retrieves the current culture. Если это было присвоено имя, отличное от французский (Франция) языка и региональных параметров, он сменит текущий язык на французский (Франция).If it is anything other than the French (France) culture, it changes the current culture to French (France). В противном случае он сменит текущий язык на французский (Люксембург).Otherwise, it changes the current culture to French (Luxembourg).

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

В следующем примере извлекается текущего языка и региональных параметров.The following example retrieves the current culture. Если это что-то иное словенский (Словения) языка и региональных параметров, он изменяет текущий язык и региональные параметры для словенский (Словения).If it is anything other the Slovenian (Slovenia) culture, it changes the current culture to Slovenian (Slovenia). В противном случае сменит текущий язык и региональные параметры как Хорватский (Хорватия).Otherwise, it changes the current culture to Croatian (Croatia).

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

Получение всех языков и региональных параметровGetting all cultures

Массив категорий языков и региональных параметров или для всех языков, доступных на локальном компьютере можно получить, вызвав GetCultures метод.You can retrieve an array specific categories of cultures or of all the cultures available on the local computer by calling the GetCultures method. Например можно получить пользовательские языки и региональные параметры, определенные языки и региональные параметры или нейтральные культуры отдельно или в сочетании.For example, you can retrieve custom cultures, specific cultures, or neutral cultures either alone or in combination.

В следующем примере вызывается GetCultures метод дважды, один со System.Globalization.CultureTypes член перечисления для получения всех пользовательских языков и региональных параметров, а затем с помощью System.Globalization.CultureTypes член перечисления для получения всех языков и региональных параметров замены.The following example calls the GetCultures method twice, first with the System.Globalization.CultureTypes enumeration member to retrieve all custom cultures, and then with the System.Globalization.CultureTypes enumeration member to retrieve all replacement cultures.

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.

Язык и региональные параметры и потоковCulture and threads

При запуске нового потока приложения, его текущего языка и региональных параметров текущего языка и региональных параметров пользовательского интерфейса определяется и текущий язык и региональные параметры, а не языка и региональных параметров текущего потока.When a new application thread is started, its current culture and current UI culture are defined by the current system culture, and not by the current thread culture. В следующем примере демонстрируется это различие.The following example illustrates the difference. Французский (Франция), язык и региональные параметры (fr-FR) задает текущий язык и региональные параметры текущего пользовательского интерфейса потока приложения.It sets the current culture and current UI culture of an application thread to the French (France) culture (fr-FR). Если текущий язык и региональные параметры fr-FR, в примере задается английский (США), язык и региональные параметры (en US).If the current culture is already fr-FR, the example sets it to the English (United States) culture (en-US). Он отображает три случайных чисел в виде значения валюты, а затем создает новый поток, который, в свою очередь, отображает три более случайных чисел в виде значения валюты.It displays three random numbers as currency values and then creates a new thread, which, in turn, displays three more random numbers as currency values. Но как видно в результатах показано в примере, значения валюты, отображаемые в новый поток не отражают соглашения о форматировании французский (Франция) языка и региональных параметров, в отличие от выходных данных из основного потока приложения.But as the output from the example shows, the currency values displayed by the new thread do not reflect the formatting conventions of the French (France) culture, unlike the output from the main application thread.

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

В версиях .NET Framework, выпущенных до .NET Framework 4.5.NET Framework 4.5, наиболее распространенный способ убедитесь, что основной поток приложения совместно тем же языком и все рабочие потоки — для передачи имени языка и региональных параметров приложения или CultureInfo объекта, представляет язык и региональные параметры уровня приложения для System.Threading.ParameterizedThreadStart делегировать.In versions of the .NET Framework before the .NET Framework 4.5.NET Framework 4.5, the most common way to ensure that the main application thread shares the same culture with all other worker threads is to pass either the name of the application-wide culture or a CultureInfo object that represents the application-wide culture to a System.Threading.ParameterizedThreadStart delegate. В следующем примере этот подход используется, чтобы убедиться, что значения валюты с двумя потоками отражают соглашения о форматировании же языка и региональных параметров.The following example uses this approach to ensure that the currency values displayed by two threads reflect the formatting conventions of the same culture.

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 €

Можно задать язык и региональные параметры пользовательского интерфейса потока пула потоков так же, как путем вызова ThreadPool.QueueUserWorkItem(WaitCallback, Object) метод.You can set the culture and UI culture of thread pool threads in a similar manner by calling the ThreadPool.QueueUserWorkItem(WaitCallback, Object) method.

Начиная с .NET Framework 4.5.NET Framework 4.5, можно задать язык и региональные параметры пользовательского интерфейса всех потоков в домене приложения напрямую, назначив CultureInfo объект, представляющий этот язык для DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture свойства.Starting with the .NET Framework 4.5.NET Framework 4.5, you can set the culture and UI culture of all threads in an application domain more directly by assigning a CultureInfo object that represents that culture to the DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture properties. В следующем примере эти свойства убедитесь, что все потоки в домене приложения по умолчанию используют же языком и региональными параметрами.The following example uses these properties to ensure that all threads in the default application domain share the same culture.

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 €

Предупреждение

Несмотря на то что DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture свойства являются статическими членами, они определяют, по умолчанию язык и региональные параметры по умолчанию пользовательский Интерфейс только для домена приложения, которая является текущей на момент установки этих значений свойства.Although the DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture properties are static members, they define the default culture and default UI culture only for the application domain that is current at the time these property values are set. Дополнительные сведения см. следующий раздел, языка и региональных параметров и домены приложений.For more information, see the next section, Culture and application domains.

При присвоении значений для DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture свойств, языка и региональных параметров пользовательского интерфейса из потоков в домене приложения также изменить, если им не явно предоставлен языка и региональных параметров.When you assign values to the DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture properties, the culture and UI culture of the threads in the application domain also change if they have not explicitly been assigned a culture. Тем не менее эти потоки отражают новые параметры языка и региональных параметров, только тогда, когда они выполняются в текущем домене приложения.However, these threads reflect the new culture settings only while they execute in the current application domain. Если эти потоки выполняются в другом домене приложения, их язык и региональные параметры становится по умолчанию язык и региональные параметры, определенные для этого домена приложения.If these threads execute in another application domain, their culture becomes the default culture defined for that application domain. Таким образом, мы рекомендуем всегда устанавливать язык и региональные параметры потока основного приложения и не полагаться на DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture свойства, чтобы изменить его.As a result, we recommend that you always set the culture of the main application thread, and not rely on the DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture properties to change it.

Язык и региональные параметры и приложения доменовCulture and application domains

DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture являются статические свойства, которые явно определить язык и региональные параметры по умолчанию только для домена приложения, которая является текущей, когда при задании или получении значения свойства.DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture are static properties that explicitly define a default culture only for the application domain that is current when the property value is set or retrieved. Следующий пример задает по умолчанию язык и региональные параметры по умолчанию пользовательского интерфейса в домене приложения по умолчанию на французский (Франция), а затем использует AppDomainSetup класс и AppDomainInitializer делегат для установки по умолчанию язык и региональные параметры пользовательского интерфейса в новый домен приложения Русский (Россия).The following example sets the default culture and default UI culture in the default application domain to French (France), and then uses the AppDomainSetup class and the AppDomainInitializer delegate to set the default culture and UI culture in a new application domain to Russian (Russia). Затем один поток выполняет два метода в каждом домене приложения.A single thread then executes two methods in each application domain. Обратите внимание, что язык и региональные параметры и язык и региональные параметры пользовательского интерфейса потока, не заданы явным образом; они являются производными от языка и региональных параметров по умолчанию пользовательского интерфейса домена приложения, в котором выполняется поток.Note that the thread's culture and UI culture are not explicitly set; they are derived from the default culture and UI culture of the application domain in which the thread is executing. Обратите внимание, что DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture свойства возвращают значение по умолчанию CultureInfo значения домена приложения, которая является текущей, при вызове метода.Note also that the DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture properties return the default CultureInfo values of the application domain that is current when the method call is made.

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

Дополнительные сведения о языков и региональных параметров и доменах приложений см. в разделе «Домены приложений и потоков» в разделе.For more information about cultures and application domains, see the "Application Domains and Threads" section in the topic.

Язык и региональные параметры и асинхронные операции на основе задачCulture and task-based asynchronous operations

На основе задач шаблон асинхронного программирования использует Task и Task<TResult> объекты асинхронно выполнение делегатов в поток пула потоков.The task-based asynchronous programming pattern uses Task and Task<TResult> objects to asynchronously execute delegates on thread pool threads. Определенного потока, на котором выполняется конкретной задачи не известна заранее, но определяется только во время выполнения.The specific thread on which a particular task runs is not known in advance, but is determined only at runtime.

Для приложений, предназначенных для .NET Framework 4.6.NET Framework 4.6 или более поздние версии, языка и региональных параметров является частью контекста асинхронной операции.For apps that target the .NET Framework 4.6.NET Framework 4.6 or later versions, culture is part of an asynchronous operation's context. Другими словами, начиная с приложений, предназначенных .NET Framework 4.6.NET Framework 4.6, асинхронные операции по умолчанию наследует значения CurrentCulture и CurrentUICulture свойства потока, откуда они запускаются.In other words, starting with apps that target the .NET Framework 4.6.NET Framework 4.6, asynchronous operations by default inherit the values of the CurrentCulture and CurrentUICulture properties of the thread from which they are launched. Если текущего языка и региональных параметров или текущего языка и региональных параметров пользовательского интерфейса отличается от языка и региональных параметров системы, текущего языка и региональных параметров пересекает границы потоков и становится текущий язык и региональные параметры потока пула потоков, которая выполняет асинхронную операцию.If the current culture or current UI culture differs from the system culture, the current culture crosses thread boundaries and becomes the current culture of the thread pool thread that is executing an asynchronous operation.

Следующий пример иллюстрирует это.The following example provides a simple illustration. Она использует TargetFrameworkAttribute атрибута к целевому объекту .NET Framework 4.6.NET Framework 4.6.It uses the TargetFrameworkAttribute attribute to target the .NET Framework 4.6.NET Framework 4.6. В примере определяется Func<TResult> делегировать, formatDelegate, который возвращает некоторые числа в виде значения валюты.The example defines a Func<TResult> delegate, formatDelegate, that returns some numbers formatted as currency values. В примере изменяется текущий язык и региональные параметры на французский (Франция) или, если французский (Франция) уже является текущим языком, английский (США).The example changes the current system culture to either French (France) or, if French (France) is already the current culture, English (United States). И она затем:It then:

  • Таким образом, чтобы он выполняется синхронно в потоке, основное приложение напрямую вызывает делегат.Invokes the delegate directly so that it runs synchronously on the main app thread.

  • Создает задачу, которая выполняет делегат асинхронно в потоке пула потоков.Creates a task that executes the delegate asynchronously on a thread pool thread.

  • Создает задачу, которая синхронно выполняет делегат в потоке основного приложения, вызвав Task.RunSynchronously метод.Creates a task that executes the delegate synchronously on the main app thread by calling the Task.RunSynchronously method.

Как показывают выходные данные из примера, при изменении текущего языка и региональных параметров для французского (Франция), текущий язык и региональные параметры потока, из которого задачи вызываются асинхронно становится текущий язык и региональные параметры для этой асинхронной операции.As the output from the example shows, when the current culture is changed to French (France), the current culture of the thread from which tasks are invoked asynchronously becomes the current culture for that asynchronous operation.

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 €

Для приложений, предназначенных для версий платформы .NET Framework до версии .NET Framework 4.6.NET Framework 4.6, или для приложений, не предназначенных для определенной версии платформы .NET Framework, язык и региональные параметры вызывающего потока не является частью контекста задачи.For apps that target versions of the .NET Framework prior to the .NET Framework 4.6.NET Framework 4.6, or for apps that do not target a particular version of the .NET Framework, the culture of the calling thread is not part of a task's context. Вместо этого если он задан явно, язык и региональные параметры новых потоков по умолчанию является язык и региональные параметры.Instead, unless one is explicitly defined, the culture of new threads by default is the system culture. В следующем примере, который работает аналогично предыдущему примеру, у него нет TargetFrameworkAttribute атрибута, это проиллюстрировано.The following example, which is identical to the previous example except that it lacks the TargetFrameworkAttribute attribute, illustrates this. Так как язык и региональные параметры системы, на котором выполняется пример был английский (США), язык и региональные параметры задачи, которое выполняется асинхронно в потоке пула потоков — en US, а не fr-FR.Because the system culture of the system on which the example executed was English (United States), the culture of the task that executes asynchronously on a thread pool thread is en-US rather than 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 €

Для приложений, предназначенных для версий платформы .NET Framework из .NET Framework 4.5.NET Framework 4.5 и более поздней версии, но до .NET Framework 4.6.NET Framework 4.6, можно использовать DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture свойства и убедитесь, что язык и региональные параметры вызывающего потока используется в асинхронной задачи, выполнение в потоках пула потоков.For apps that target versions of the .NET Framework from the .NET Framework 4.5.NET Framework 4.5 and later but prior to the .NET Framework 4.6.NET Framework 4.6, you can use the DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture properties to ensure that the culture of the calling thread is used in asynchronous tasks that execute on thread pool threads. Следующий пример идентичен предыдущему примеру, за исключением того, что она использует DefaultThreadCurrentCulture языка и региональных параметров, как основного потока приложения имеют свойства, чтобы обеспечить этот поток из пула потоков.The following example is identical to the previous example, except that it uses the DefaultThreadCurrentCulture property to ensure that thread pool threads have the same culture as the main app thread.

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 и DefaultThreadCurrentUICulture — на уровне приложения свойства домена; то есть установленный им культуру по умолчанию для всех потоков явно не назначены языка и региональных параметров в конкретном домене приложения.DefaultThreadCurrentCulture and DefaultThreadCurrentUICulture are per-app domain properties; that is, they establish a default culture for all threads not explicitly assigned a culture in a specific application domain. Однако для приложений, предназначенных для .NET Framework 4.6.NET Framework 4.6 или более поздней версии, языка и региональных параметров вызывающего потока остается частью контекста асинхронной задачи, даже если задачи за пределами домена приложения.However, for apps that target the .NET Framework 4.6.NET Framework 4.6 or later, the culture of the calling thread remains part of an asynchronous task's context even if the task crosses app domain boundaries.

В следующем примере показано, что язык и региональные параметры вызывающего потока остается текущего языка и региональных параметров асинхронной операции на основе задач, даже если метод, который выполняется задача за пределами домена приложения.The following example shows that the calling thread's culture remains the current culture of a task-based asynchronous operation even if the method that the task is executing crosses application domain boundaries. Он определяет класс, DataRetriever, с единственным методом, GetFormattedNumber, который возвращает случайное число двойной точности с плавающей запятой от 1 до 1000, в формате денежной единицы.It defines a class, DataRetriever, with a single method, GetFormattedNumber, that returns a random double-precision floating-point number between 1 and 1,000 formatted as a currency value. Первая задача выполняется, просто создает DataRetriever экземпляра и вызывает его GetFormattedNumber метод.A first task is run that simply instantiates a DataRetriever instance and calls its GetFormattedNumber method. Вторая задача сообщает свой текущий домен приложения, создает новый домен приложения, который создает экземпляры DataRetriever экземпляра в новый домен приложения и вызывает его GetFormattedNumber метод.A second task reports its current application domain, creates a new application domain, instantiates a DataRetriever instance in the new application domain, and calls its GetFormattedNumber method. Как видно из примера, текущий язык и региональные параметры сохранилась на прежнем уровне в вызывающий поток, первая задача и вторая задача при выполнении в домене основного приложения и втором домене приложения.As the output from the example shows, the current culture has remained the same in the calling thread, the first task, and the second task both when it was executing in the main application domain and the second application domain.

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 €

Сериализация объектов CultureInfoCultureInfo object serialization

Когда CultureInfo сериализации объекта, фактически хранятся лишь Name и UseUserOverride.When a CultureInfo object is serialized, all that is actually stored is Name and UseUserOverride. Он десериализуется успешно только в среде, где, Name имеет то же значение.It is successfully de-serialized only in an environment where that Name has the same meaning. В следующих трех примерах показано, почему это не всегда так:The following three examples show why this is not always the case:

  • Если CultureTypes свойство имеет значение System.Globalization.CultureTypes, и если этот язык и региональные параметры впервые появилась в Windows Vista или более поздней версии операционной системы Windows, его невозможно десериализовать его в операционной системе Windows XP.If the CultureTypes property value is System.Globalization.CultureTypes, and if that culture was first introduced in Windows Vista or a later version of the Windows operating system, it is not possible to de-serialize it on Windows XP. Аналогично Если язык и региональные параметры, появившийся в Windows XP с пакетом обновления 2, не невозможно десериализовать его для системы Windows XP, на котором не установлен язык и региональные параметры.Similarly, if the culture was first introduced in Windows XP Service Pack 2, it is not possible to de-serialize it for a Windows XP system on which the culture has not been installed.

  • Если CultureTypes значение System.Globalization.CultureTypesи компьютер, на котором он десериализуется не поддерживает этот пользователь пользовательского языка и региональных параметров установки, невозможно выполнить десериализацию его.If the CultureTypes value is System.Globalization.CultureTypes, and the computer on which it is de-serialized does not have this user custom culture installed, it is not possible to de-serialize it.

  • Если CultureTypes значение System.Globalization.CultureTypesи компьютер, на котором он десериализуется не поддерживает этот замены языка и региональных параметров, десериализуются тем же именем, но не все те же характеристики.If the CultureTypes value is System.Globalization.CultureTypes, and the computer on which it is de-serialized does not have this replacement culture, it de-serializes to the same name, but not all of the same characteristics. Например en US — замены языка и региональных параметров на компьютере A, но не на компьютере B, если CultureInfo объект, ссылающийся на этот язык и региональные параметры сериализуется на компьютере A и на компьютере B, а затем нет пользовательские характеристики языка и региональных параметров передаются.For example, if en-US is a replacement culture on computer A, but not on computer B, and if a CultureInfo object referring to this culture is serialized on computer A and de-serialized on computer B, then none of the custom characteristics of the culture are transmitted. Язык и региональные параметры десериализуются успешно, но с другим значением.The culture de-serializes successfully, but with a different meaning.

Переопределяет панели управленияControl Panel overrides

Пользователь может выбрать переопределить некоторые значения, связанные с текущей культурой Windows путем языковых и региональных параметров в панели управления.The user might choose to override some of the values associated with the current culture of Windows through the regional and language options portion of Control Panel. Например пользователь может выбрать для отображения даты в другом формате или использовать денежные единицы, кроме порта по умолчанию для языка и региональных параметров.For example, the user might choose to display the date in a different format or to use a currency other than the default for the culture. Как правило в приложениях должны учитываться эти переопределения пользователем.In general, your applications should honor these user overrides.

Если UseUserOverridetrue и указанного языка и региональных параметров совпадает с текущего языка и региональных параметров Windows, CultureInfo использует эти переопределения, включая пользовательские настройки для свойства DateTimeFormatInfo экземпляр, возвращаемый DateTimeFormat свойство, свойства и NumberFormatInfo экземпляр, возвращаемый NumberFormat свойство.If UseUserOverride is true and the specified culture matches the current culture of Windows, the CultureInfo uses those overrides, including user settings for the properties of the DateTimeFormatInfo instance returned by the DateTimeFormat property, and the properties of the NumberFormatInfo instance returned by the NumberFormat property. Если параметры пользователя, несовместимы с языка и региональных параметров, связанных с CultureInfo, например, если выбранный календарь не является одним из OptionalCalendars, результаты методов и значения свойств не определены.If the user settings are incompatible with the culture associated with the CultureInfo, for example, if the selected calendar is not one of the OptionalCalendars, the results of the methods and the values of the properties are undefined.

Альтернативные порядки сортировкиAlternate sort orders

Некоторые культуры поддерживают больше одного порядка сортировки.Some cultures support more than one sort order. Пример:For example:

  • Испанский (Испания) языка и региональных параметров есть два порядка сортировки: порядок международная сортировка по умолчанию, а традиционный порядок сортировки.The Spanish (Spain) culture has two sort orders: the default international sort order, and the traditional sort order. При создании экземпляра CultureInfo объект с именем язык и региональные параметры es-ES, используется международный порядок сортировки.When you instantiate a CultureInfo object with the es-ES culture name, the international sort order is used. При создании экземпляра CultureInfo объект с именем язык и региональные параметры es-ES-tradnl, использовать традиционный порядок сортировки.When you instantiate a CultureInfo object with the es-ES-tradnl culture name, the traditional sort order is used.

  • Культура zh-CN (китайский (упрощенное письмо, КНР)) поддерживает два порядка сортировки: по произношению (по умолчанию) и по числу штрихов.The zh-CN (Chinese (Simplified, PRC)) culture supports two sort orders: by pronunciation (the default) and by stroke count. При создании экземпляра CultureInfo объект с именем языка и региональных параметров zh-CN, используется порядок сортировки по умолчанию.When you instantiate a CultureInfo object with the zh-CN culture name, the default sort order is used. При создании экземпляра CultureInfo объекта с локальным идентификатором 0x00020804, строки будут отсортированы по числу штрихов.When you instantiate a CultureInfo object with a local identifier of 0x00020804, strings are sorted by stroke count.

В следующей таблице перечислены культуры, поддерживающие альтернативные порядки сортировки и идентификаторы для по умолчанию и активации альтернативных порядков сортировки.The following table lists the cultures that support alternate sort orders and the identifiers for the default and alternate sort orders.

Имя языка и региональных параметровCulture name cultureCulture Имя сортировки по умолчанию и идентификаторDefault sort name and identifier Имя альтернативного сортировки и идентификаторAlternate sort name and identifier
es-ESes-ES Испанский (Испания)Spanish (Spain) Международная: 0x00000C0AInternational: 0x00000C0A Традиционные: 0x0000040ATraditional: 0x0000040A
zh-TWzh-TW Китайский (Тайвань)Chinese (Taiwan) Количество штрихов: 0x00000404Stroke Count: 0x00000404 Bopomofo: 0x00030404Bopomofo: 0x00030404
zh-CNzh-CN Китайский (КНР)Chinese (PRC) Произношение: 0x00000804Pronunciation: 0x00000804 Количество штрихов: 0x00020804Stroke Count: 0x00020804
zh-HKzh-HK Китайский (Гонконг)Chinese (Hong Kong SAR) Количество штрихов: 0x00000c04Stroke Count: 0x00000c04 Количество штрихов: 0x00020c04Stroke Count: 0x00020c04
zh-SGzh-SG Китайский (Сингапур)Chinese (Singapore) Произношение: 0x00001004Pronunciation: 0x00001004 Количество штрихов: 0x00021004Stroke Count: 0x00021004
zh-MOzh-MO Китайский (МАКАО)Chinese (Macao SAR) Произношение: 0x00001404Pronunciation: 0x00001404 Количество штрихов: 0x00021404Stroke Count: 0x00021404
ja-JPja-JP Японский (Япония)Japanese (Japan) По умолчанию: 0x00000411Default: 0x00000411 Юникод: 0x00010411Unicode: 0x00010411
ko-KRko-KR Корейский (Корея)Korean (Korea) По умолчанию: 0x00000412Default: 0x00000412 Корейский Xwansung - Юникода: 0x00010412Korean Xwansung - Unicode: 0x00010412
de-DEde-DE Немецкий (Германия)German (Germany) Словарь: 0x00000407Dictionary: 0x00000407 Сортировка по телефонной книге DIN: 0x00010407Phone Book Sort DIN: 0x00010407
hu-HUhu-HU Венгерский (Венгрия)Hungarian (Hungary) По умолчанию: 0x0000040eDefault: 0x0000040e Техническая сортировка: 0x0001040eTechnical Sort: 0x0001040e
ка GEka-GE Грузинский (Грузия)Georgian (Georgia) Традиционные: 0x00000437Traditional: 0x00000437 Современная сортировка: 0x00010437Modern Sort: 0x00010437

Текущий язык и региональные параметры и приложениях универсальной платформы WindowsThe current culture and UWP apps

В приложениях универсальной платформы Windows (UWP) CurrentCulture и CurrentUICulture свойства доступны для чтения записи, так же, как они находятся в приложениях .NET Framework и .NET Core.In Universal Windows Platform (UWP) apps, the CurrentCulture and CurrentUICulture properties are read-write, just as they are in .NET Framework and .NET Core apps. Однако приложений универсальной платформы Windows распознает одного языка и региональных параметров.However, UWP apps recognize a single culture. CurrentCulture И CurrentUICulture свойства сопоставляются с первым значением в Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages коллекции.The CurrentCulture and CurrentUICulture properties map to the first value in the Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages collection.

В приложениях .NET Framework и .NET Core, текущий язык и региональные параметры — это параметр отдельного потока и CurrentCulture и CurrentUICulture свойства отражают языка и региональных параметров пользовательского интерфейса только текущего потока.In .NET Framework and .NET Core apps, the current culture is a per-thread setting, and the CurrentCulture and CurrentUICulture properties reflect the culture and UI culture of the current thread only. В приложениях UWP текущего языка и региональных параметров сопоставляется Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages коллекции, которая является глобальным параметром.In UWP apps, the current culture maps to the Windows.ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languages collection, which is a global setting. Установка CurrentCulture или CurrentUICulture свойство изменяет язык и региональные параметры для всего приложения; язык и региональные параметры нельзя задать для каждого потока.Setting the CurrentCulture or CurrentUICulture property changes the culture of the entire app; culture cannot be set on a per-thread basis.

Конструкторы

CultureInfo(Int32)

Инициализирует новый экземпляр класса CultureInfo на основе языка и региональных параметров, заданных идентификатором. Initializes a new instance of the CultureInfo class based on the culture specified by the culture identifier.

CultureInfo(Int32, Boolean)

Инициализирует новый экземпляр класса CultureInfo на основе языка и региональных параметров, заданных идентификатором, и логического значения, указывающего, нужно ли использовать выбранные пользователем параметры языка и региональных параметров в операционной системе. Initializes a new instance of the CultureInfo class based on the culture specified by the culture identifier and on the Boolean that specifies whether to use the user-selected culture settings from the system.

CultureInfo(String)

Инициализирует новый экземпляр класса CultureInfo на основе языка и региональных параметров, заданных именем. Initializes a new instance of the CultureInfo class based on the culture specified by name.

CultureInfo(String, Boolean)

Инициализирует новый экземпляр класса CultureInfo на основе языка и региональных параметров, заданных именем, и логического значения, указывающего, нужно ли использовать выбранные пользователем параметры языка и региональных параметров в операционной системе. Initializes a new instance of the CultureInfo class based on the culture specified by name and on the Boolean that specifies whether to use the user-selected culture settings from the system.

Свойства

Calendar

Возвращает календарь, используемый по умолчанию для языка и региональных параметров. Gets the default calendar used by the culture.

CompareInfo

Возвращает объект CompareInfo, который определяет способ сравнения строк в данном языке и региональных параметрах. Gets the CompareInfo that defines how to compare strings for the culture.

CultureTypes

Возвращает типы языков и региональных параметров, относящихся к текущему объекту CultureInfo. Gets the culture types that pertain to the current CultureInfo object.

CurrentCulture

Возвращает или задает объект CultureInfo, представляющий язык и региональные параметры, используемые текущим потоком. Gets or sets the CultureInfo object that represents the culture used by the current thread.

CurrentUICulture

Возвращает или задает объект CultureInfo, представляющий текущий язык и региональные параметры пользовательского интерфейса, используемые диспетчером ресурсов для поиска ресурсов, связанных с конкретным языком и региональными параметрами, во время выполнения. Gets or sets the CultureInfo object that represents the current user interface culture used by the Resource Manager to look up culture-specific resources at run time.

DateTimeFormat

Возвращает или задает объект DateTimeFormatInfo, определяющий формат отображения даты и времени, соответствующий языку и региональным параметрам. Gets or sets a DateTimeFormatInfo that defines the culturally appropriate format of displaying dates and times.

DefaultThreadCurrentCulture

Возвращает или задает язык и региональные параметры, используемые по умолчанию для потоков в текущем домене приложения. Gets or sets the default culture for threads in the current application domain.

DefaultThreadCurrentUICulture

Возвращает или задает язык и региональные параметры пользовательского интерфейса, используемые по умолчанию для потоков в текущем домене приложения. Gets or sets the default UI culture for threads in the current application domain.

DisplayName

Возвращает полное локализованное имя языка и региональных параметров. Gets the full localized culture name.

EnglishName

Возвращает имя языка и региональных параметров в формате languagefull [country/regionfull] на английском языке. Gets the culture name in the format languagefull [country/regionfull] in English.

IetfLanguageTag

Не рекомендуется. Deprecated. Возвращает идентификацию языка по стандарту RFC 4646. Gets the RFC 4646 standard identification for a language.

InstalledUICulture

Возвращает объект CultureInfo, представляющий язык и региональные параметры, установленные с операционной системой. Gets the CultureInfo that represents the culture installed with the operating system.

InvariantCulture

Возвращает объект CultureInfo, не зависящий от языка и региональных параметров (инвариантный). Gets the CultureInfo object that is culture-independent (invariant).

IsNeutralCulture

Возвращает значение, показывающее, представляет ли текущий объект CultureInfo нейтральный язык и региональные параметры. Gets a value indicating whether the current CultureInfo represents a neutral culture.

IsReadOnly

Возвращает значение, указывающее, является ли текущий объект CultureInfo доступным только для чтения. Gets a value indicating whether the current CultureInfo is read-only.

KeyboardLayoutId

Возвращает активный идентификатор языка ввода. Gets the active input locale identifier.

LCID

Возвращает идентификатор языка и региональных параметров для текущего объекта CultureInfo. Gets the culture identifier for the current CultureInfo.

Name

Возвращает имя языка и региональных параметров в формате languagecode2-country/regioncode2. Gets the culture name in the format languagecode2-country/regioncode2.

NativeName

Возвращает имя языка и региональных параметров, состоящих из языка, страны или региона и дополнительного набора символов, которые свойственны для этого языка. Gets the culture name, consisting of the language, the country/region, and the optional script, that the culture is set to display.

NumberFormat

Возвращает или задает объект NumberFormatInfo, определяющий формат отображения чисел, денежной единицы и процентов, соответствующий языку и региональным параметрам. Gets or sets a NumberFormatInfo that defines the culturally appropriate format of displaying numbers, currency, and percentage.

OptionalCalendars

Возвращает список календарей, которые могут использоваться в данном языке и региональных параметров. Gets the list of calendars that can be used by the culture.

Parent

Возвращает объект CultureInfo, представляющий родительский язык и региональные параметры текущего объекта CultureInfo. Gets the CultureInfo that represents the parent culture of the current CultureInfo.

TextInfo

Возвращает объект TextInfo, определяющий систему письма, связанную с данным языком и региональными параметрами. Gets the TextInfo that defines the writing system associated with the culture.

ThreeLetterISOLanguageName

Возвращает трехбуквенный код ISO 639-2 для языка текущего объекта CultureInfo. Gets the ISO 639-2 three-letter code for the language of the current CultureInfo.

ThreeLetterWindowsLanguageName

Возвращает трехбуквенный код для языка, определенный в формате Windows API. Gets the three-letter code for the language as defined in the Windows API.

TwoLetterISOLanguageName

Возвращает двухбуквенный код ISO 639-1 для языка текущего объекта CultureInfo. Gets the ISO 639-1 two-letter code for the language of the current CultureInfo.

UseUserOverride

Возвращает значение, указывающее, использует ли текущий объект CultureInfo параметры языка и региональных параметров, выбранные пользователем. Gets a value indicating whether the current CultureInfo object uses the user-selected culture settings.

Методы

ClearCachedData()

Обновляет кешированные данные, связанные с языком и региональными параметрами. Refreshes cached culture-related information.

Clone()

Создает копию текущего поставщика CultureInfo. Creates a copy of the current CultureInfo.

CreateSpecificCulture(String)

Создает объект CultureInfo, который представляет определенный язык и региональные параметры, соответствующие заданному имени. Creates a CultureInfo that represents the specific culture that is associated with the specified name.

Equals(Object)

Определяет, является ли заданный объект тем же языком и региональными параметрами, что и CultureInfo. Determines whether the specified object is the same culture as the current CultureInfo.

GetConsoleFallbackUICulture()

Возвращает язык и региональные стандарты интерфейса пользователя, подходящие для приложений консоли, если при этом неприменим язык и региональные стандарты графического пользовательского интерфейса по умолчанию. Gets an alternate user interface culture suitable for console applications when the default graphic user interface culture is unsuitable.

GetCultureInfo(Int32)

Служит для получения кешированного доступного только для чтения экземпляра языка и региональных параметров с помощью указанного идентификатора языка и региональных параметров. Retrieves a cached, read-only instance of a culture by using the specified culture identifier.

GetCultureInfo(String)

Возвращает кешированный экземпляр языка и региональных параметров с помощью указанного имени. Retrieves a cached, read-only instance of a culture using the specified culture name.

GetCultureInfo(String, String)

Служит для получения кешированного экземпляра языка и региональных параметров, доступного только для чтения. Retrieves a cached, read-only instance of a culture. В параметрах определяется язык и региональные параметры, которые инициализируются вместе с объектами TextInfo и CompareInfo, заданными другим языком и региональными параметрами. Parameters specify a culture that is initialized with the TextInfo and CompareInfo objects specified by another culture.

GetCultureInfoByIetfLanguageTag(String)

Не рекомендуется. Deprecated. Служит для получения объекта CultureInfo, доступного только для чтения, который имеет языковые характеристики, указываемые определенным языковым тегом RFC 4646. Retrieves a read-only CultureInfo object having linguistic characteristics that are identified by the specified RFC 4646 language tag.

GetCultures(CultureTypes)

Возвращает список поддерживаемых языков и региональных параметров, отфильтрованный по заданному значению параметра CultureTypes. Gets the list of supported cultures filtered by the specified CultureTypes parameter.

GetFormat(Type)

Возвращает объект, определяющий способ форматирования заданного типа. Gets an object that defines how to format the specified type.

GetHashCode()

Служит хэш-функцией текущего класса CultureInfo для использования в алгоритмах и структурах данных хеширования, например в хэш-таблице. Serves as a hash function for the current CultureInfo, suitable for hashing algorithms and data structures, such as a hash table.

GetType()

Возвращает объект Type для текущего экземпляра. Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object. Creates a shallow copy of the current Object.

(Inherited from Object)
ReadOnly(CultureInfo)

Возвращает программу-оболочку, доступную только для чтения, для заданного объекта CultureInfo. Returns a read-only wrapper around the specified CultureInfo object.

ToString()

Возвращает строку, содержащую имя текущего объекта CultureInfo в формате languagecode2-country/regioncode2. Returns a string containing the name of the current CultureInfo in the format languagecode2-country/regioncode2.

Применяется к

См. также