CultureInfo クラス

定義

特定のカルチャ (アンマネージ コードの開発では "ロケール" と呼ばれます) に関する情報を提供します。 この情報には、カルチャの名前、表記体系、使用する暦、文字列の並べ替え順序、および日付と数値の書式が含まれます。

public ref class CultureInfo : IFormatProvider
public ref class CultureInfo : ICloneable, IFormatProvider
public class CultureInfo : IFormatProvider
public class CultureInfo : ICloneable, IFormatProvider
[System.Serializable]
public class CultureInfo : ICloneable, IFormatProvider
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class CultureInfo : ICloneable, IFormatProvider
type CultureInfo = class
    interface IFormatProvider
type CultureInfo = class
    interface ICloneable
    interface IFormatProvider
[<System.Serializable>]
type CultureInfo = class
    interface ICloneable
    interface IFormatProvider
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type CultureInfo = class
    interface ICloneable
    interface IFormatProvider
Public Class CultureInfo
Implements IFormatProvider
Public Class CultureInfo
Implements ICloneable, IFormatProvider
継承
CultureInfo
属性
実装

次の例は、スペイン語 (スペイン) のオブジェクトを国際並べ替えで作成する方法と、従来の並べ替えを使用する別のオブジェクト CultureInfo CultureInfo を作成する方法を示しています。

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

/*
This code produces the following output.

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

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

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

public class SamplesCultureInfo
{

   public static void Main()
   {

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

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

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

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

/*
This code produces the following output.

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

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

*/
Imports System.Collections
Imports System.Globalization

Module Module1

    Public Sub Main()

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

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

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

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

    End Sub



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

End Module

注釈

クラスは、 CultureInfo 特定のカルチャに関連付けられた言語、サブ言語、国/地域、暦、規則などのカルチャ固有の情報を提供します。 このクラスは、、、、およびの各オブジェクトのカルチャ固有のインスタンスへのアクセスも提供し DateTimeFormatInfo NumberFormatInfo CompareInfo TextInfo ます。 これらのオブジェクトには、大文字と小文字の区別、日付と数値の書式設定、文字列の比較など、カルチャ固有の操作に必要な情報が含まれています。 CultureInfoクラスは String 、、、 DateTime 、および数値型など、カルチャ固有のデータを書式設定、解析、または操作するクラスによって直接的または間接的に使用され DateTimeOffset ます。

このセクションの内容:

カルチャ名と識別子
インバリアント、ニュートラル、および特定のカルチャ
カスタムカルチャ
動的なカルチャデータ
CultureInfo と文化のデータ
現在のカルチャと現在の UI カルチャ
すべてのカルチャを取得する
カルチャとスレッド
カルチャとアプリケーションドメイン
カルチャとタスクベースの非同期操作
CultureInfo オブジェクトのシリアル化
コントロールパネルの上書き
代替の並べ替え順序
カルチャと Windows アプリ\

カルチャ名と識別子

クラスは、 CultureInfo RFC 4646 に基づいて、カルチャごとに一意の名前を指定します。 名前は、言語に関連付けられた ISO 639 2 文字の小文字カルチャコードと、国または地域に関連付けられている ISO 3166 2 文字の大文字サブカルチャコードを組み合わせたものです。 さらに、.NET Framework 4 以降を対象とし、Windows 10 以降で実行されているアプリでは、有効な BCP-47 言語タグに対応するカルチャ名がサポートされます。

注意

カルチャ名がクラスコンストラクターまたはやなどのメソッドに渡される場合 CreateSpecificCulture CultureInfo 、その大文字と小文字は区別されません。

RFC 4646 に基づくカルチャ名の形式はです languagecode2 - country/regioncode2 。ここで、 languagecode2 は2文字の言語コードで、 country/regioncode2 は2文字のサブカルチャコードです。 例 ja-JP として、日本語 (日本) と en-US 英語 (米国) があります。 2 文字の言語コードが使用できない場合は、ISO 639-2 から派生した 3 文字のコードが使用されます。

カルチャ名によっては、ISO 15924 スクリプトも指定します。 たとえば、Cyrl はキリルスクリプトを指定し、Latn は Latin スクリプトを指定します。 スクリプトを含むカルチャ名は、パターンを使用し languagecode2 - scripttag - country/regioncode2 ます。 この種類のカルチャ名の例と uz-Cyrl-UZ して、ウズベク語 (キリル、ウズベキスタン) が挙げられます。 Vista Windows する前に Windows オペレーティングシステムでは、スクリプトを含むカルチャ名には、 languagecode2 - country/regioncode2 - scripttag たとえば、 uz-UZ-Cyrl ウズベク語 (キリル、ウズベキスタン) などのパターンが使用されます。

ニュートラルカルチャは、2文字の小文字の言語コードのみによって指定されます。 たとえば、は、 fr フランス語のニュートラルカルチャを指定し、 de ドイツ語のニュートラルカルチャを指定します。

注意

この規則に矛盾する2つのカルチャ名があります。 カルチャ中国語 (簡体字)、名前付き、 zh-Hans および繁体字中国語 (繁体字) zh-Hant はニュートラルカルチャです。 カルチャ名は現在の標準を表し、古い名前とを使用する理由がない限り、使用する必要があり zh-CHS zh-CHT ます。

カルチャ識別子は、標準の国際数字の省略形であり、インストールされているカルチャの1つを一意に識別するために必要なコンポーネントを備えています。 アプリケーションでは、定義済みのカルチャ識別子を使用することも、カスタム識別子を定義することもできます。

特定の定義済みカルチャ名と識別子は、このクラスおよび名前空間の他のクラスで使用され System.Globalization ます。 Windows システムの詳細なカルチャ情報については、 Windows でサポートされる言語/地域名の一覧の「言語タグ」列を参照してください。 カルチャ名は、BCP 47 によって定義されている標準に準拠します。

カルチャ名と識別子は、特定のコンピューターで検出できるカルチャのサブセットのみを表します。 Windows のバージョンまたはサービスパックは、使用可能なカルチャを変更できます。 アプリケーションでは、クラスを使用してカスタムカルチャを追加でき CultureAndRegionInfoBuilder ます。 ユーザーは、 Microsoft Locale Builder ツールを使用して、独自のカスタムカルチャを追加できます。 Microsoft Locale Builder は、クラスを使用してマネージコードで記述されてい CultureAndRegionInfoBuilder ます。

いくつかの異なる名前は、特に次のクラスメンバーに関連付けられた名前というカルチャに密接に関連付けられています。

インバリアント、ニュートラル、および特定のカルチャ

カルチャは、通常、インバリアントカルチャ、ニュートラルカルチャ、および特定のカルチャという3つのセットにグループ化されています。

インバリアントカルチャは、カルチャに依存しません。 アプリケーションで、空の文字列 ("") またはその識別子を使用して、名前でインバリアントカルチャを指定します。 InvariantCulture インバリアントカルチャのインスタンスを定義します。 英語と関連付けられていますが、国/地域には関連付けられていません。 これは、 Globalization カルチャを必要とする名前空間のほとんどすべてのメソッドで使用されます。

ニュートラルカルチャは、言語に関連付けられているが、国/地域に関連付けられていないカルチャです。 特定のカルチャとは、言語および国/地域に関連付けられているカルチャです。 たとえば、 fr はフランス語カルチャのニュートラル名で、 fr-FR は特定のフランス語 (フランス) カルチャの名前です。 中国語 (簡体字) と繁体字中国語は、ニュートラルカルチャとも見なされることに注意してください。

ニュートラルカルチャのクラスのインスタンスを作成する CompareInfo ことはお勧めしません。含まれるデータは任意です。 データの表示と並べ替えを行うには、言語と地域の両方を指定します。 また、 Name CompareInfo ニュートラルカルチャ用に作成されたオブジェクトのプロパティは、国のみを返し、地域は含まれません。

定義されたカルチャには、特定のカルチャの親がニュートラルカルチャであり、ニュートラルカルチャの親がインバリアントカルチャである階層があります。 プロパティは、 Parent 特定のカルチャに関連付けられているニュートラルカルチャを格納します。 カスタムカルチャでは、 Parent このパターンに準拠してプロパティを定義する必要があります。

特定のカルチャのリソースがオペレーティングシステムで使用できない場合は、関連付けられているニュートラルカルチャのリソースが使用されます。 ニュートラルカルチャのリソースが使用できない場合は、メインアセンブリに埋め込まれているリソースが使用されます。 リソースフォールバックプロセスの詳細については、「 リソースのパッケージ化と配置」を参照してください。

Windows API のロケールの一覧は、.net でサポートされているカルチャの一覧とは若干異なります。 たとえば、p/invoke メカニズムを使用して Windows との相互運用性が必要な場合、アプリケーションでは、オペレーティングシステムに対して定義されている特定のカルチャを使用する必要があります。 特定のカルチャを使用すると、同等の Windows ロケールとの一貫性が確保されます。これは、と同じロケール識別子で識別され LCID ます。

DateTimeFormatInfoまたはは、 NumberFormatInfo インバリアントカルチャまたは特定のカルチャに対してのみ作成でき、ニュートラルカルチャでは作成できません。

DateTimeFormatInfo.Calendarがで、がに設定されて TaiwanCalendar いない場合、、、およびは Thread.CurrentCulture zh-TW DateTimeFormatInfo.NativeCalendarName 空の DateTimeFormatInfo.GetEraName DateTimeFormatInfo.GetAbbreviatedEraName 文字列 ("") を返します。

カスタムカルチャ

Windows では、カスタムロケールを作成できます。 詳細については、「 カスタムロケール」を参照してください。

CultureInfo と文化のデータ

.NET は、実装、プラットフォーム、およびバージョンに応じて、さまざまなソースからカルチャデータを派生させることができます。

  • .NET Framework 3.5 以前のバージョンでは、Windows オペレーティングシステムと .NET Framework の両方によってカルチャデータが提供されます。

  • .NET Framework 4 以降のバージョンでは、Windows オペレーティングシステムによってカルチャデータが提供されます。

  • Windows で実行されている .net Core のすべてのバージョンでは、Windows オペレーティングシステムによってカルチャデータが提供されます。

  • Unix プラットフォームで実行されている .NET Core のすべてのバージョンでは、 International Components For Unicode (ICU) ライブラリによってカルチャデータが提供されます。 ICU ライブラリの特定のバージョンは、個々のオペレーティングシステムによって異なります。

このため、特定の .NET 実装、プラットフォーム、またはバージョンで使用できるカルチャは、別の .NET 実装、プラットフォーム、またはバージョンでは使用できない場合があります。

一部 CultureInfo のオブジェクトは、基になるプラットフォームによって異なります。 特に、、、または中国語 (簡体字、 zh-CN 中国) と zh-TW 、または中国語 (繁体字、台湾) は Windows システムで使用できますが、Unix システムではエイリアス化されたカルチャです。 "zh-tw" は "zh-tw" カルチャのエイリアスであり、"zh-tw-TW" は "zh-tw-Zh-hant" カルチャのエイリアスとして使用されます。 エイリアス化されたカルチャは、メソッドの呼び出しによって返されることはありません GetCultures 。また、異なるカルチャを含む異なるプロパティ値が Windows 対応する場合もあり Parent ます。 との zh-CN zh-TW カルチャでは、次のような違いがあります。

  • Windows システムでは、"zh-tw" カルチャの親カルチャは "zh-tw-Hans" であり、"zh-tw" カルチャの親カルチャは "zh-tw-zh-hant" です。 これらのカルチャの親カルチャは、両方とも "zh-tw" です。 Unix システムでは、両方のカルチャの親は "zh-tw" です。 これは、"zh-tw" または "zh-tw" カルチャのカルチャ固有のリソースを提供しないが、ニュートラル "zh-tw" または "zh-tw" カルチャのリソースを提供する場合、アプリケーションは、ニュートラルカルチャのリソースを Unix 上ではなく Windows に読み込むことを意味します。 Unix システムでは、スレッドのを明示的に CurrentUICulture "zh-tw-Hans" または "zh-tw-zh-hant" に設定する必要があります。

  • Windows システムで、 CultureInfo.Equals "zh-tw" カルチャを表すインスタンスでを呼び出し、それに "zh-tw-Hans" インスタンスを渡すと、が返さ true れます。 Unix システムでは、メソッドの呼び出しはを返し false ます。 この動作は、 Equals "zh-tw" インスタンスでを呼び出し CultureInfo 、それに "Zh-tw-zh-hant" インスタンスを渡す場合にも適用されます。

動的なカルチャデータ

インバリアントカルチャを除き、カルチャデータは動的です。 これは、定義済みのカルチャに対しても当てはまります。 たとえば、国または地域で新しい通貨を採用したり、単語のスペルを変更したり、優先する暦を変更したり、カルチャの定義を変更してこれを追跡したりします。 カスタムカルチャは予告なしに変更される可能性があり、特定のカルチャはカスタムの置換カルチャによってオーバーライドされることがあります。 また、以下で説明するように、個々のユーザーはカルチャ設定をオーバーライドできます。 アプリケーションでは、常に実行時にカルチャデータを取得する必要があります。

注意事項

データを保存する場合は、アプリケーションでインバリアントカルチャ、バイナリ形式、または特定のカルチャに依存しない形式を使用する必要があります。 インバリアントカルチャ以外の特定のカルチャに関連付けられている現在の値に従って保存されたデータは読み取り不能になるか、またはそのカルチャが変更された場合に意味が変化する可能性があります。

現在のカルチャと現在の UI カルチャ

.NET アプリケーションのすべてのスレッドには、現在のカルチャと現在の UI カルチャがあります。 現在のカルチャでは、日付、時刻、数値、通貨値の書式指定規則、テキストの並べ替え順序、大文字小文字の規則、および文字列を比較する方法が決定されます。 現在の UI カルチャは、実行時にカルチャ固有のリソースを取得するために使用されます。

注意

現在の UI カルチャと現在の UI カルチャがスレッドごとにどのように決定されるかについては、「 カルチャとスレッド 」セクションを参照してください。 新しいアプリケーションドメインで実行されるスレッドと、アプリケーションドメインの境界を越えるスレッドで現在および現在の UI カルチャがどのように決定されるかについては、「 カルチャとアプリケーションドメイン 」を参照してください。 タスクベースの非同期操作を実行するスレッドで現在のと現在のがどのように決定されるかについては、「 カルチャとタスクベースの非同期操作 」セクションを参照してください。

現在のカルチャの詳細については、プロパティのトピックを参照してください CultureInfo.CurrentCulture 。 現在の UI カルチャの詳細については、プロパティのトピックを参照してください CultureInfo.CurrentUICulture

現在の UI カルチャと現在の UI カルチャを取得する

現在のカルチャを表すオブジェクトを取得するには、 CultureInfo 次の2つの方法があります。

次の例では、両方のプロパティ値を取得し、それらが等しいと表示されるように比較し、現在のカルチャの名前を表示します。

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現在の UI カルチャを表すオブジェクトを取得するには、次の2つの方法があります。

次の例では、両方のプロパティ値を取得し、それらが等しいと表示されるように比較し、現在の UI カルチャの名前を表示します。

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

public class Example
{
   public static void Main()
   {
      CultureInfo uiCulture1 = CultureInfo.CurrentUICulture;
      CultureInfo uiCulture2 = Thread.CurrentThread.CurrentUICulture;
      Console.WriteLine("The current UI culture is {0}", uiCulture1.Name);
      Console.WriteLine("The two CultureInfo objects are equal: {0}",
                        uiCulture1 == uiCulture2);
   }
}
// The example displays output like the following:
//     The current UI culture is en-US
//     The two CultureInfo objects are equal: True
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

現在の UI カルチャと現在の UI カルチャを設定する

スレッドのカルチャと UI カルチャを変更するには、次の手順を実行します。

  1. CultureInfoクラスコンストラクターを呼び出してカルチャの名前を渡すことによって、そのカルチャを表すオブジェクトをインスタンス化し CultureInfo ます。 コンストラクターは、 CultureInfo(String) CultureInfo 新しいカルチャが現在の Windows カルチャと同じである場合に、ユーザーオーバーライドを反映するオブジェクトをインスタンス化します。 CultureInfo(String, Boolean)コンストラクターを使用すると、 CultureInfo 新しいカルチャが現在の Windows カルチャと同じ場合に、新しくインスタンス化されたオブジェクトにユーザーオーバーライドを反映するかどうかを指定できます。

  2. オブジェクトを CultureInfo CultureInfo.CurrentCulture .net Core のプロパティまたはプロパティに割り当てるか、 CultureInfo.CurrentUICulture 4.6 以降のバージョン .NET Framework します。 (.NET Framework 4.5.2 以前のバージョンで CultureInfo は、オブジェクトをまたはプロパティに割り当てることができ Thread.CurrentCulture Thread.CurrentUICulture ます)。

次の例では、現在のカルチャを取得します。 フランス語 (フランス) カルチャ以外の場合は、現在のカルチャをフランス語 (フランス) に変更します。 それ以外の場合は、現在のカルチャをフランス語 (ルクセンブルク) に変更します。

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      CultureInfo current = CultureInfo.CurrentCulture;
      Console.WriteLine("The current culture is {0}", current.Name);
      CultureInfo newCulture;
      if (current.Name.Equals("fr-FR"))
         newCulture = new CultureInfo("fr-LU");
      else
         newCulture = new CultureInfo("fr-FR");

      CultureInfo.CurrentCulture = newCulture;
      Console.WriteLine("The current culture is now {0}",
                        CultureInfo.CurrentCulture.Name);
   }
}
// The example displays output like the following:
//     The current culture is en-US
//     The current culture is now fr-FR
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

次の例では、現在のカルチャを取得します。 他のスロベニア語 (スロベニア) カルチャである場合は、現在のカルチャをスロベニア語 (スロベニア) に変更します。 それ以外の場合は、現在のカルチャをクロアチア語 (クロアチア) に変更します。

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

すべてのカルチャを取得する

メソッドを呼び出すことにより、ローカルコンピューターで使用可能な特定のカテゴリのカルチャまたはすべてのカルチャの配列を取得でき GetCultures ます。 たとえば、カスタムカルチャ、特定のカルチャ、またはニュートラルカルチャを単独で、または組み合わせて取得できます。

次の例では、 GetCultures メソッドを2回呼び出します。最初に、列挙体メンバーを使用して System.Globalization.CultureTypes すべてのカスタムカルチャを取得した後、列挙体メンバーを使用してすべての System.Globalization.CultureTypes 置換カルチャを取得します。

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.

カルチャとスレッド

新しいアプリケーションスレッドが開始されると、現在のカルチャと現在の UI カルチャは、現在のシステムカルチャによって定義され、現在のスレッドカルチャによっては定義されません。 この違いを次の例に示します。 現在のカルチャと、アプリケーションスレッドの現在の UI カルチャをフランス語 (フランス) カルチャ (fr-fr) に設定します。 現在のカルチャが既に fr-fr の場合、この例では英語 (米国) カルチャ (en-us) に設定します。 通貨値として3つの乱数が表示され、新しいスレッドが作成されます。これにより、3つの乱数が通貨値として表示されます。 ただし、この例の出力に示されているように、新しいスレッドによって表示される通貨値には、メインアプリケーションスレッドからの出力とは異なり、フランス語 (フランス) カルチャの書式指定規則が反映されていません。

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

4.5 .NET Framework より前のバージョンの .NET Framework では、メインアプリケーションスレッドが他のすべてのワーカースレッドと同じカルチャを共有するための最も一般的な方法は、アプリケーション全体のカルチャの名前か、 CultureInfo アプリケーション全体のカルチャを表すオブジェクトをデリゲートに渡すことです System.Threading.ParameterizedThreadStart 。 次の例では、この方法を使用して、2つのスレッドによって表示される通貨値が、同じカルチャの書式指定規則を反映するようにしています。

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 €

スレッドプールのスレッドのカルチャと UI カルチャは、メソッドを呼び出すことによって同様の方法で設定でき ThreadPool.QueueUserWorkItem(WaitCallback, Object) ます。

.NET Framework 4.5 以降では、 CultureInfo そのカルチャを表すオブジェクトをプロパティとプロパティに割り当てることにより、アプリケーションドメイン内のすべてのスレッドのカルチャと UI カルチャをより直接的に設定でき DefaultThreadCurrentCulture DefaultThreadCurrentUICulture ます。 次の例では、これらのプロパティを使用して、既定のアプリケーションドメイン内のすべてのスレッドが同じカルチャを共有するようにしています。

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 プロパティとプロパティは静的メンバーですが、既定のカルチャと既定の UI カルチャは、これらのプロパティ値が設定された時点で最新のアプリケーションドメインに対してのみ定義されます。 詳細については、次の「 カルチャとアプリケーションドメイン」を参照してください。

プロパティとプロパティに値を割り当てると DefaultThreadCurrentCulture DefaultThreadCurrentUICulture 、アプリケーションドメイン内のスレッドのカルチャと UI カルチャも、カルチャが明示的に割り当てられていない場合は変更されます。 ただし、これらのスレッドは、現在のアプリケーションドメインでの実行中にのみ、新しいカルチャ設定を反映します。 これらのスレッドが別のアプリケーションドメインで実行される場合、そのカルチャは、そのアプリケーションドメインに対して定義されている既定のカルチャになります。 そのため、常にメインアプリケーションスレッドのカルチャを設定することをお勧めし DefaultThreadCurrentCulture ます。また、プロパティとプロパティを使用して変更することは避けて DefaultThreadCurrentUICulture ください。

カルチャとアプリケーションドメイン

DefaultThreadCurrentCultureDefaultThreadCurrentUICulture は、プロパティ値が設定または取得されたときに現在のアプリケーションドメインに対してのみ、既定のカルチャを明示的に定義する静的プロパティです。 次の例では、既定のカルチャと既定の UI カルチャを既定のアプリケーションドメインのフランス語 (フランス) に設定し、クラスとデリゲートを使用して、 AppDomainSetup AppDomainInitializer 新しいアプリケーションドメインの既定のカルチャと ui カルチャをロシア語 (ロシア) に設定します。 次に、1つのスレッドが各アプリケーションドメインで2つのメソッドを実行します。 スレッドのカルチャと UI カルチャが明示的に設定されていないことに注意してください。これらは、スレッドが実行されているアプリケーションドメインの既定のカルチャおよび UI カルチャから派生します。 また、 DefaultThreadCurrentCulture プロパティとプロパティは、 DefaultThreadCurrentUICulture CultureInfo メソッド呼び出しが行われたときの最新のアプリケーションドメインの既定値を返すことにも注意してください。

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

public class Example
{
   public static void Main()
   {
      // Set the default culture and display the current date in the current application domain.
      Info info1 = new Info();
      SetAppDomainCultures("fr-FR");

      // Create a second application domain.
      AppDomainSetup setup = new AppDomainSetup();
      setup.AppDomainInitializer = SetAppDomainCultures;
      setup.AppDomainInitializerArguments = new string[] { "ru-RU" };
      AppDomain domain = AppDomain.CreateDomain("Domain2", null, setup);
      // Create an Info object in the new application domain.
      Info info2 = (Info) domain.CreateInstanceAndUnwrap(typeof(Example).Assembly.FullName,
                                                         "Info");

      // Execute methods in the two application domains.
      info2.DisplayDate();
      info2.DisplayCultures();

      info1.DisplayDate();
      info1.DisplayCultures();
   }

   public static void SetAppDomainCultures(string[] names)
   {
      SetAppDomainCultures(names[0]);
   }

   public static void SetAppDomainCultures(string name)
   {
       try {
         CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture(name);
         CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture(name);
      }
      // If an exception occurs, we'll just fall back to the system default.
      catch (CultureNotFoundException) {
         return;
      }
      catch (ArgumentException) {
         return;
      }
   }
}

public class Info : MarshalByRefObject
{
   public void DisplayDate()
   {
      Console.WriteLine("Today is {0:D}", DateTime.Now);
   }

   public void DisplayCultures()
   {
      Console.WriteLine("Application domain is {0}", AppDomain.CurrentDomain.Id);
      Console.WriteLine("Default Culture: {0}", CultureInfo.DefaultThreadCurrentCulture);
      Console.WriteLine("Default UI Culture: {0}", CultureInfo.DefaultThreadCurrentUICulture);
   }
}
// The example displays the following output:
//       Today is 14 октября 2011 г.
//       Application domain is 2
//       Default Culture: ru-RU
//       Default UI Culture: ru-RU
//       Today is vendredi 14 octobre 2011
//       Application domain is 1
//       Default Culture: fr-FR
//       Default UI Culture: fr-FR
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

カルチャとアプリケーションドメインの詳細については、「 アプリケーション ドメイン」トピックの「アプリケーションドメインとスレッド」セクションを参照してください。

カルチャとタスクベースの非同期操作

タスクベースの非同期プログラミングパターンでは Task 、オブジェクトとオブジェクトを使用して、 Task<TResult> スレッドプールのスレッドでデリゲートを非同期的に実行します。 特定のタスクが実行される特定のスレッドは事前にわからないが、実行時にのみ決定されます。

.NET Framework 4.6 以降のバージョンを対象とするアプリの場合、カルチャは非同期操作のコンテキストの一部になります。 つまり、.NET Framework 4.6 を対象とするアプリから、既定では、非同期操作は、 CurrentCulture CurrentUICulture 起動元のスレッドのプロパティとプロパティの値を継承します。 現在のカルチャまたは現在の UI カルチャがシステムカルチャと異なる場合、現在のカルチャはスレッド境界を越えて、非同期操作を実行しているスレッドプールスレッドの現在のカルチャになります。

簡単な例を次に示します。 この例では、属性を使用して TargetFrameworkAttribute .NET Framework 4.6 を対象としています。 この例では、 Func<TResult> formatDelegate 通貨値として書式設定された数値を返すデリゲートを定義します。 この例では、現在のシステムカルチャをフランス語 (フランス) に変更するか、フランス語 (フランス) が既に現在のカルチャである場合は英語 (米国) に変更します。 次のようになります。

  • メインアプリスレッドで同期的に実行されるように、デリゲートを直接呼び出します。

  • スレッドプールのスレッドでデリゲートを非同期的に実行するタスクを作成します。

  • メソッドを呼び出すことによって、メインアプリスレッド上でデリゲートを同期的に実行するタスクを作成し Task.RunSynchronously ます。

この例の出力に示すように、現在のカルチャがフランス語 (フランス) に変更されると、タスクが非同期に呼び出されるスレッドの現在のカルチャが、非同期操作の現在のカルチャになります。

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

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

public class Example
{

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

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

       Console.WriteLine("The example is running on thread {0}",
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}",
                         CultureInfo.CurrentCulture.Name);
       if (CultureInfo.CurrentCulture.Name == "fr-FR")
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
       else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

       Console.WriteLine("Changed the current culture to {0}.\n",
                         CultureInfo.CurrentCulture.Name);

       // Execute the delegate synchronously.
       Console.WriteLine("Executing the delegate synchronously:");
       Console.WriteLine(formatDelegate());

       // Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously:");
       var t1 = Task.Run(formatDelegate);
       Console.WriteLine(t1.Result);

       Console.WriteLine("Executing a task synchronously:");
       var t2 = new Task<String>(formatDelegate);
       t2.RunSynchronously();
       Console.WriteLine(t2.Result);
   }
}
// The example displays the following output:
//         The example is running on thread 1
//         The current culture is en-US
//         Changed the current culture to fr-FR.
//
//         Executing the delegate synchronously:
//         Formatting using the fr-FR culture on thread 1.
//         163 025 412,32 €   18 905 365,59 €
//
//         Executing a task asynchronously:
//         Formatting using the fr-FR culture on thread 3.
//         163 025 412,32 €   18 905 365,59 €
//
//         Executing a task synchronously:
//         Formatting using the fr-FR culture on thread 1.
//         163 025 412,32 €   18 905 365,59 €
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 4.6 より前のバージョンの .NET Framework を対象とするアプリ、または特定のバージョンの .NET Framework を対象としないアプリの場合、呼び出し元スレッドのカルチャは、タスクのコンテキストの一部ではありません。 代わりに、1つのが明示的に定義されている場合を除き、既定では、新しいスレッドのカルチャはシステムカルチャになります。 次の例は、前の例と同じですが、属性を持たない点が異なり TargetFrameworkAttribute ます。 この例を実行したシステムのシステムカルチャは英語 (米国) であるため、スレッドプールのスレッドで非同期に実行されるタスクのカルチャは en-US ではなくに 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 4.6 より前の .NET Framework 4.5 以降のバージョンの .NET Framework を対象とするアプリでは、 DefaultThreadCurrentCulture プロパティとプロパティを使用し DefaultThreadCurrentUICulture て、スレッドプールのスレッドで実行される非同期タスクで、呼び出し元のスレッドのカルチャが使用されるようにすることができます。 次の例は前の例と同じですが、プロパティを使用して、 DefaultThreadCurrentCulture スレッドプールのスレッドがメインアプリスレッドと同じカルチャを持つことを確認します。

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

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

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

       Console.WriteLine("The example is running on thread {0}",
                         Thread.CurrentThread.ManagedThreadId);
       // Make the current culture different from the system culture.
       Console.WriteLine("The current culture is {0}",
                         CultureInfo.CurrentCulture.Name);
       if (CultureInfo.CurrentCulture.Name == "fr-FR")
          Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
       else
          Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

       Console.WriteLine("Changed the current culture to {0}.\n",
                         CultureInfo.CurrentCulture.Name);
       CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CurrentCulture;

       // Execute the delegate synchronously.
       Console.WriteLine("Executing the delegate synchronously:");
       Console.WriteLine(formatDelegate());

       // Call an async delegate to format the values using one format string.
       Console.WriteLine("Executing a task asynchronously:");
       var t1 = Task.Run(formatDelegate);
       Console.WriteLine(t1.Result);

       Console.WriteLine("Executing a task synchronously:");
       var t2 = new Task<String>(formatDelegate);
       t2.RunSynchronously();
       Console.WriteLine(t2.Result);
   }
}
// The example displays the following output:
//     The example is running on thread 1
//     The current culture is en-US
//     Changed the current culture to fr-FR.
//
//     Executing the delegate synchronously:
//     Formatting using the fr-FR culture on thread 1.
//     163 025 412,32 €   18 905 365,59 €
//
//     Executing a task asynchronously:
//     Formatting using the fr-FR culture on thread 3.
//     163 025 412,32 €   18 905 365,59 €
//
//     Executing a task synchronously:
//     Formatting using the fr-FR culture on thread 1.
//     163 025 412,32 €   18 905 365,59 €
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 €

DefaultThreadCurrentCultureDefaultThreadCurrentUICulture はアプリごとのドメインプロパティです。つまり、特定のアプリケーションドメインでカルチャが明示的に割り当てられていないすべてのスレッドに既定のカルチャを設定します。 ただし、.NET Framework 4.6 以降を対象とするアプリでは、タスクがアプリケーションドメインの境界を越えている場合でも、呼び出し元のスレッドのカルチャは非同期タスクのコンテキストの一部にとどまります。

次の例は、タスクが実行されているメソッドがアプリケーションドメインの境界を越えている場合でも、呼び出し元のスレッドのカルチャがタスクベースの非同期操作の現在のカルチャを維持していることを示しています。 このクラスは、 DataRetriever GetFormattedNumber 1 ~ 1000 の範囲のランダム倍精度浮動小数点数を通貨値として返す、単一のメソッドを持つクラスを定義します。 インスタンスをインスタンス化し、そのメソッドを呼び出すだけの最初のタスクが実行され DataRetriever GetFormattedNumber ます。 2番目のタスクは、現在のアプリケーションドメインを報告し、新しいアプリケーションドメインを作成し、 DataRetriever 新しいアプリケーションドメインのインスタンスをインスタンス化して、そのメソッドを呼び出し GetFormattedNumber ます。 この例の出力に示されているように、現在のカルチャは、呼び出し元のスレッド、最初のタスク、および2番目のタスクがメインアプリケーションドメインと2番目のアプリケーションドメインで実行されているときの両方で同じままです。

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 €

CultureInfo オブジェクトのシリアル化

オブジェクトを CultureInfo シリアル化する場合、実際に格納されるのはとだけです Name UseUserOverride 。 同じ意味を持つ環境でのみ、正常に逆シリアル化され Name ます。 次の3つの例では、これが常にそうであるとは限りません。

  • プロパティ値が の場合、そのカルチャが Windows オペレーティング システムの特定のバージョンで最初に導入された場合、以前のバージョンの Windows で逆シリアル化はできません CultureTypes CultureTypes.InstalledWin32Cultures 。 たとえば、カルチャが Windows 10で導入された場合、そのカルチャをWindows 8。

  • 値が で、逆シリアル化されるコンピューターにこのユーザー カスタム カルチャがインストールされていない場合は、逆シリアル CultureTypes CultureTypes.UserCustomCulture 化できません。

  • 値が で、逆シリアル化されるコンピューターにこの置換カルチャが存在しない場合は、同じ名前に逆シリアル化されますが、同じ特性のすべてではありません CultureTypes CultureTypes.ReplacementCultures 。 たとえば、 がコンピューター A の置換カルチャであり、コンピューター B では使用できない場合、このカルチャを参照するオブジェクトがコンピューター A でシリアル化され、コンピューター B で逆シリアル化された場合、カルチャのカスタム特性は送信されません。 en-US CultureInfo カルチャは正常に逆シリアル化されますが、意味は異なります。

コントロール パネルオーバーライド

ユーザーは、現在のカルチャに関連付けられている値の一部を、Windows の地域と言語のオプション部分を通じてオーバーライドコントロール パネル。 たとえば、ユーザーは、日付を別の形式で表示したり、カルチャに既定以外の通貨を使用したりすることができます。 一般に、アプリケーションでは、これらのユーザーのオーバーライドを優先する必要があります。

が で、指定したカルチャが Windows の現在のカルチャと一致する場合、 では、プロパティによって返されるインスタンスのプロパティのユーザー設定や、 プロパティによって返されるインスタンスのプロパティなど、これらのオーバーライドが使用されます。 UseUserOverride true CultureInfo DateTimeFormatInfo DateTimeFormat NumberFormatInfo NumberFormat ユーザー設定が に関連付けられているカルチャと互換性がない場合 (たとえば、選択したカレンダーが の 1 つではない場合)、メソッドの結果とプロパティの値は未定義になります。 CultureInfo OptionalCalendars

代替の並べ替え順序

一部のカルチャでは、複数の並べ替え順序がサポートされています。 次に例を示します。

  • スペイン語 (スペイン) カルチャには、既定の国際並べ替え順序と従来の並べ替え順序の 2 つの並べ替え順序があります。 カルチャ名を使用して CultureInfo オブジェクトをインスタンス es-ES 化すると、国際順の並べ替え順序が使用されます。 カルチャ名を使用して CultureInfo オブジェクトをインスタンス化 es-ES-tradnl すると、従来の並べ替え順序が使用されます。

  • (簡体中国語、PRC)) カルチャでは、発音 (既定値) とストローク数の 2 つの並べ替え zh-CN 順序がサポートされています。 カルチャ名を使用して CultureInfo オブジェクトをインスタンス zh-CN 化すると、既定の並べ替え順序が使用されます。 オブジェクトのローカル識別子を使用してオブジェクトをインスタンス化すると0x00020804文字列はストローク数 CultureInfo で並べ替えされます。

代替の並べ替え順序をサポートするカルチャと、各カルチャの既定の並べ替え順序および代替の並べ替え順序の識別子を次の表に示します。

カルチャ名 カルチャ 既定の並べ替え名と識別子 代替の並べ替え名と識別子
es-ES スペイン語 (スペイン) International: 0x00000C0A Traditional: 0x0000040A
zh-TW 中国語 (台湾) Stroke Count: 0x00000404 Bopomofo: 0x00030404
zh-CN 中国語 (中華人民共和国) Pronunciation: 0x00000804 Stroke Count: 0x00020804
zh-HK 中国語 (香港特別行政区) Stroke Count: 0x00000c04 Stroke Count: 0x00020c04
zh-SG 中国語 (シンガポール) Pronunciation: 0x00001004 Stroke Count: 0x00021004
zh-MO 中国語 (中華人民共和国マカオ特別行政区) Pronunciation: 0x00001404 Stroke Count: 0x00021404
ja-JP 日本語 (日本) Default: 0x00000411 Unicode: 0x00010411
ko-KR 韓国語 (韓国) Default: 0x00000412 Korean Xwansung - Unicode: 0x00010412
de-DE ドイツ語 (ドイツ) Dictionary: 0x00000407 Phone Book Sort DIN: 0x00010407
hu-HU ハンガリー語 (ハンガリー) Default: 0x0000040e Technical Sort: 0x0001040e
ka-GE グルジア語 (グルジア) Traditional: 0x00000437 Modern Sort: 0x00010437

現在のカルチャと UWP アプリ

ユニバーサル Windows プラットフォーム (UWP) アプリでは、プロパティと プロパティは、.NET Framework および .NET Core アプリと同様に読み取 CurrentCulture CurrentUICulture り/書き込み可能です。 ただし、UWP アプリは 1 つのカルチャを認識します。 プロパティ CurrentCultureCurrentUICulture プロパティは、 プロパティの最初の値にWindows。ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languagesコレクション。

.NET Core .NET Frameworkでは、現在のカルチャはスレッドごとの設定であり、 プロパティと プロパティには現在のスレッドのカルチャと UI カルチャ CurrentCulture CurrentUICulture だけが反映されます。 UWP アプリでは、現在のカルチャは UWP アプリにWindows。グローバル設定である ApplicationModel.Resources.Core.ResourceManager.DefaultContext.Languagesコレクション。 プロパティまたは プロパティを設定すると、アプリ全体のカルチャが変更 CurrentCulture CurrentUICulture されます。culture をスレッドごとに設定することはできません。

コンストラクター

CultureInfo(Int32)

カルチャ識別子によって指定するカルチャに基づいて、CultureInfo クラスの新しいインスタンスを初期化します。

CultureInfo(Int32, Boolean)

カルチャ識別子で指定されたカルチャと、ユーザーが選択したカルチャ設定を Windows から使用するかどうかを指定する値に基づいて、 クラスの新しいインスタンス CultureInfo を初期化します。

CultureInfo(String)

名前で指定するカルチャに基づいて、CultureInfo クラスの新しいインスタンスを初期化します。

CultureInfo(String, Boolean)

名前で指定されたカルチャと、Windows からユーザーが選択したカルチャ設定を使用するかどうかを指定する値に基づいて、 クラスの新しいインスタンス CultureInfo を初期化します。

プロパティ

Calendar

カルチャで使用する既定の暦を取得します。

CompareInfo

カルチャの文字列を比較する方法を定義する CompareInfo を取得します。

CultureTypes

現在の CultureInfo オブジェクトに関するカルチャ タイプを取得します。

CurrentCulture

CultureInfo現在のスレッドおよびタスクベースの非同期操作によって使用されるカルチャを表すオブジェクトを取得または設定します。

CurrentUICulture

実行時にカルチャ固有のリソースを参照するためにリソース マネージャーによって使用される現在のユーザー インターフェイスのカルチャを表す CultureInfo オブジェクトを取得または設定します。

DateTimeFormat

カルチャに対応する、日時の表示形式を定義する DateTimeFormatInfo を取得または設定します。

DefaultThreadCurrentCulture

現在のアプリケーション ドメインのスレッドの既定のカルチャを取得または設定します。

DefaultThreadCurrentUICulture

現在のアプリケーション ドメイン内のスレッドの既定 UI カルチャを取得または設定します。

DisplayName

完全にローカライズされたカルチャ名を取得します。

EnglishName

英語で表した "languagefull [country/regionfull]" という形式のカルチャ名を取得します。

IetfLanguageTag

非推奨になりました。 言語の RFC 4646 標準 ID を取得します。

InstalledUICulture

オペレーティング システムと共にインストールされたカルチャを表す CultureInfo を取得します。

InvariantCulture

カルチャに依存しない (インバリアントな) CultureInfo オブジェクトを取得します。

IsNeutralCulture

現在の CultureInfo がニュートラル カルチャを表しているかどうかを示す値を取得します。

IsReadOnly

現在の CultureInfo が読み取り専用かどうかを示す値を取得します。

KeyboardLayoutId

アクティブな入力ロケール識別子を取得します。

LCID

現在の CultureInfo のカルチャ識別子を取得します。

Name

languagecode2-country/regioncode2 という形式のカルチャ名を取得します。

NativeName

カルチャの表示設定である、言語、国/地域、およびオプションのスクリプトで構成されるカルチャ名を取得します。

NumberFormat

数値、通貨、割合を表示する、カルチャに対応する書式を定義する NumberFormatInfo を取得または設定します。

OptionalCalendars

カルチャで使用できる暦の一覧を取得します。

Parent

現在の CultureInfo の親カルチャを表す CultureInfo を取得します。

TextInfo

カルチャに関連付けられている書記体系を定義する TextInfo を取得します。

ThreeLetterISOLanguageName

現在の CultureInfo の言語に対する ISO 639-2 の 3 桁の文字コードを取得します。

ThreeLetterWindowsLanguageName

Windows API の定義に従って、言語に対する 3 文字コードを取得します。

TwoLetterISOLanguageName

現在の CultureInfo の言語に対する ISO 639-1 の 2 桁の文字コードを取得します。

UseUserOverride

現在の CultureInfo オブジェクトでユーザーが選択したカルチャ設定を使用するかどうかを示す値を取得します。

メソッド

ClearCachedData()

キャッシュされたカルチャ関連情報を更新します。

Clone()

現在の CultureInfo のコピーを作成します。

CreateSpecificCulture(String)

指定した名前に関連付けられている特定のカルチャを表す CultureInfo を作成します。

Equals(Object)

指定したオブジェクトが現在の CultureInfo と同じカルチャかどうかを判断します。

GetConsoleFallbackUICulture()

グラフィック ユーザー インターフェイスの既定のカルチャが不適切な場合、コンソール アプリケーションに適した代替のユーザー インターフェイス カルチャを取得します。

GetCultureInfo(Int32)

指定されたカルチャ識別子を使用して、カルチャのキャッシュされた読み取り専用インスタンスを取得します。

GetCultureInfo(String)

指定されたカルチャ名を使用して、カルチャのキャッシュされた読み取り専用インスタンスを取得します。

GetCultureInfo(String, Boolean)

カルチャのキャッシュされた読み取り専用インスタンスを取得します。

GetCultureInfo(String, String)

カルチャのキャッシュされた読み取り専用インスタンスを取得します。 パラメーターは、別のカルチャで指定された TextInfo オブジェクトおよび CompareInfo オブジェクトで初期化されたカルチャを指定します。

GetCultureInfoByIetfLanguageTag(String)

非推奨になりました。 指定された RFC 4646 言語タグで示される言語特性を持つ、読み取り専用 CultureInfo オブジェクトを取得します。

GetCultures(CultureTypes)

サポートされているカルチャを、指定した CultureTypes パラメーターでフィルター処理した結果のリストを取得します。

GetFormat(Type)

指定した型に書式指定する方法を定義するオブジェクトを取得します。

GetHashCode()

現在の CultureInfo のハッシュ関数として機能します。ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。

GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
ReadOnly(CultureInfo)

指定した CultureInfo オブジェクトをラップする読み取り専用のラッパーを返します。

ToString()

languagecode2-country/regioncode2 という形式で、現在の CultureInfo の名前を格納している文字列を返します。

適用対象

こちらもご覧ください