CultureInfo.CurrentCultureはString.Format()で本当に必要ですか?
-
19-08-2019 - |
質問
メソッドIFormatProvider
でString.Format(string, object)
を提供するにはどうすれば本当に必要だと思いますか?
完全なバリアントを記述する方が良いですか
String.Format(CultureInfo.CurrentCulture, "String is {0}", str);
または単に
String.Format("String is {0}", str);
?
解決
一般に、生成する文字列を現在のユーザーのカルチャに依存しない方法で保持する場合(レジストリやファイルなど)には、InvariantCultureを使用します。
UIで現在のユーザー(フォーム、レポート)に表示される文字列にCurrentCultureを使用します。
InvariantCultureを使用する必要がある場所でCurrentCultureを使用すると、微妙なバグが発生する可能性があります:異なるカルチャを持つ複数のユーザーが同じレジストリエントリまたはファイルにアクセスする場合、またはユーザーがデフォルトのカルチャを変更する場合にのみ明らかになるバグ。
CurrentCultureを明示的に指定する(IFormatProvider引数を省略した場合のデフォルト)は、本質的に、上記を考慮し、生成される文字列は現在のユーザーのカルチャを使用する必要があることを示すドキュメントです。そのため、FxCopでは、IFormatProvider引数を指定することを推奨しています。
他のヒント
IFormatProvider
を指定しない場合(または同等にnull
を渡す場合)、ほとんどの引数タイプは最終的にCultureInfo.CurrentCulture
に従ってフォーマットされます。おもしろいのは、カスタムのCultureInfo.CurrentUICulture
を指定して、引数のフォーマットで最初のクラックを取得するか、他のコンテキストに応じてフォーマットカルチャをオーバーライドできることです。
<=>はリソースの選択ではなく、引数のフォーマットに影響することに注意してください。リソースの選択は<=>によって制御されます。
いいえ、文字列にカルチャに応じてレンダリングする必要がある小数点区切り文字、通貨などのカルチャ固有の要素が含まれていない限り、カルチャを指定する必要はありません。
アプリケーションのローカリゼーション(グローバリゼーション)を重視する場合に特に役立ちます。つまり、アプリで複数の言語と文化固有の形式をサポートする場合は、それを使用する必要があります。