インバリアントカルチャーとは


回答:


132

インバリアントカルチャは、変更されないために役立つ特別なカルチャです。現在のカルチャーは、ユーザーごとに、または実行ごとに変わる可能性があるため、同じであることに依存することはできません。

たとえばシリアル化など、いくつかのフローでは毎回同じカルチャを使用できることが非常に重要です。あるカルチャでは1,1の値を、別のカルチャでは1.1の値を使用できます。2番目のカルチャで "1,1"値を解析しようとすると、解析は失敗します。ただし、インバリアントカルチャを使用して数値を文字列に変換し、後で任意のカルチャセットを持つ任意のコンピューターから解析することができます。

// Use some non-invariant culture.
CultureInfo nonInvariantCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = nonInvariantCulture;

decimal dec = 1.1m;
string convertedToString = dec.ToString();

// Simulate another culture being used,
// following code can run on another computer.
nonInvariantCulture.NumberFormat.NumberDecimalSeparator = ",";

decimal parsedDec;

try
{
    // This fails because value cannot be parsed.
    parsedDec = decimal.Parse(convertedToString);
}
catch (FormatException)
{
}

// However you always can use Invariant culture:
convertedToString = dec.ToString(CultureInfo.InvariantCulture);

// This will always work because you serialized with the same culture.
parsedDec = decimal.Parse(convertedToString, CultureInfo.InvariantCulture);

9
価値があることについては、これはSystem.Globalization名前空間にあります。
ジムH.

1
同じ文化でシリアル化したので、これは常に機能します <<これは私には意味がありませんでした。私は何かを誤解していると思います。CultureInfo.InvariantCulture同じカルチャーでシリアル化したために使用する場合は、使用するのと同じではありませんCultureInfo.CurrentCultureか?
Alisson 2017

3
@Alisson Andrewの最後の2つのコードステートメントを元のフローに戻すと、もっと理にかなっていると思います。を使用して常にシリアル化するとCultureInfo.InvariantCulture、を使用して常に10進数に構文解析できることがわかりますCultureInfo.InvariantCulture。を使用CultureInfo.CurrentCultureしてシリアル化する場合、ユーザーは現在のカルチャとして「en-US」を使用している可能性があります。それを解析して10進数に戻す次のユーザーは、区切り記号として「、」を使用する現在のカルチャを持っている可能性があります。
David Specht 2017

1
@Andrewたぶん私は濃密ですが、Davidのコメントがなければ、あなたの言っていることが理解できませんでした。あなたの回答を明確にするために編集しました。
jpaugh 2017年

111

定義された行動を伴う英語に基づく偽の文化。たとえば、ユーザーが定義したカルチャに関係なく読み書きできるように、構成ファイルにデータを書き込むのに最適です。

基本的に、それは人工的で変化しない特定の文化です。


4
具体的には、数値の文字列形式でのコンマやポイントのさまざまな使用法や、大文字と小文字の変換に気付かないでしょう。
Steve Gilham、2011年

8
はい...典型的な問題:*単語が英語だと思うアメリカのプログラマー;)そして、ドイツの顧客は1000に対して1.000,00を書き込みます;)痛い *同じ言語であっても、たとえばスイスとドイツでは「。」を使用します。と "、"はさまざまな方法で数字で表します。結果->設定ファイルはゴミです。そこでインバリアント言語を使用してください;)
TomTom 2010年

23
スティーブのコメントに追加するには:実際にどのように見えるかを気にしない場合に使用する文化です(ユーザーがコンマを使用するか点を使用するかは関係ありません。ユーザーには表示されないためです)。常に必要です。同じであること(例えば、あなたが書いたものを読むことができる必要があるため)。
itowlson

7

これは、文化に関係なく同じものに使用されます(適切な文化Xに翻訳する必要はありません)。

例として-https://msdn.microsoft.com/en-us/library/4c5zdc6a(v = vs.100).aspx。ユーザーがいじり回してはならないアプリ固有のファイルを書き出すときは、カルチャパラメーターを受け取るすべてのメソッドにInvariantCultureを使用する必要があります。

上記のリンクされたドキュメントごとに注意してください:

ただし、アプリケーションは、ファイルに永続化されるデータのフォーマットや解析など、カルチャに依存しない結果を必要とするプロセスに対してのみ、インバリアントカルチャを使用する必要があります。


3
これは、インバリアントカルチャが中間形式であることのみを目的としていること、つまり、インバリアントカルチャの出力であるもの(つまり、インバリアントカルチャの「中」)をユーザーに表示している場合は、何かが間違っており、不変の文化を理解していない。
mlhDev

3

インバリアントカルチャはカルチャに依存しません。英語に関連付けられていますが、国/地域には関連付けられていません。

CultureInfo.InvariantCultureは、インバリアントカルチャのインスタンスを取得します。カルチャを必要とするSystem.Globalization名前空間のほとんどすべてのメソッドで使用できます。

CompareInfo、DateTimeFormat、NumberFormatなどのプロパティによって返されるオブジェクトは、インバリアントカルチャの文字列比較とフォーマット規則も反映しています。InvariantCultureプロパティは、文化に依存しない形式で永続データを表示する場合に便利です。

たとえば、アプリケーションの現在のカルチャとは関係なく、数値または日時を特定の形式で表示する場合は、CultureInfo.InvariantCultureを使用できます。


0

これは、ユニバーサルでシンプルな非地域固有の英語およびその他の関連情報です。それはプログラミング言語自体の言語のようなものです。ユニバーサルカレンダーを設定する際には、これを利用できます。コントローラ名、URL、デリゲート名などを生成する必要がある状況では... すべてのユーザー間で自然かつ普遍的に行動するためのものが必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.