web-dev-qa-db-ja.com

String.Format()でCultureInfo.CurrentCultureは本当に必要ですか?

メソッドString.Format(string, object)IFormatProviderを提供するために本当に必要だと思いますか?

完全なバリアントを書く方が良いですか

String.Format(CultureInfo.CurrentCulture, "String is {0}", str);

あるいは単に

String.Format("String is {0}", str);

26
abatishchev

一般に、生成している文字列を現在のユーザーのカルチャに依存しない方法で永続化する場合(レジストリやファイルなど)、InvariantCultureを使用することをお勧めします。

UIで現在のユーザー(フォーム、レポート)に表示される文字列にはCurrentCultureを使用することをお勧めします。

InvariantCultureを使用する必要がある場所でCurrentCultureを使用すると、微妙なバグが発生する可能性があります。異なるカルチャを持つ複数のユーザーが同じレジストリエントリまたはファイルにアクセスしている場合、またはユーザーがデフォルトのカルチャを変更した場合にのみ発生するバグです。

CurrentCulture(IFormatProvider引数が省略されている場合のデフォルト)を明示的に指定することは、基本的に、上記を考慮し、生成される文字列が現在のユーザーのカルチャを使用する必要があることを示すドキュメントです。そのため、FxCopではIFormatProvider引数を指定することをお勧めします。

30
Joe

IFormatProviderを指定しない場合(または同等にnullを渡す場合)、ほとんどの引数タイプは最終的にCultureInfo.CurrentCultureに従ってフォーマットされます。興味深いのは、引数のフォーマットで最初のクラックを取得できるカスタムIFormatProviderを指定したり、他のコンテキストに応じてフォーマットカルチャをオーバーライドしたりできることです。

CultureInfo.CurrentCultureは、リソースの選択ではなく、引数のフォーマットに影響することに注意してください。リソースの選択はCultureInfo.CurrentUICultureによって制御されます。

19
Jeffrey Hantin

いいえ、文字列に小数点、通貨などのカルチャ固有の要素が含まれていない限り、カルチャを指定する必要はありません。これらの要素は、カルチャに応じてレンダリングする必要があります。

6
Spikolynn

アプリケーションのローカリゼーション(グローバリゼーション)に関心がある場合に特に役立ちます。つまり、アプリで複数の言語とカルチャ固有の形式をサポートする場合は、それを使用する必要があります。

4
Ian P