20

CurrentCultureまたはInvariantCultureを指定し、カルチャをまったく指定しないためのベストプラクティスは何ですか?

私が読んだことから、たとえば、シリアル化を行う場合、データ値の正規表現を指定する手段としてInvariantCultureが必要です。これは、カルチャベースの文字列操作の比較的小さな割合です。

私はそれを長く、冗長で、ほとんどの場合、私が行うたびにそれを指定するのは醜いです、と言います:

var greeting = string.Format(CultureInfo.CurrentCulture, "Hello ", userName); 

しかし、私のチームは最近FxCopをオンにしたため、CultureInfoを常にどこでも使用するようになりました。簡潔さ、読みやすさ、機能性を組み合わせるための最良のテクニックは何ですか?

いくつかの良い読み物:

4

2 に答える 2

19

ここでは、固有のトレードオフがあります。

少なくとも、プログラム内で何かをしているときはいつでもInvariantCultureを使用するようにCultureInfoを指定する必要があります。たとえば、これをシリアル化で使用すると、データ表現が常に同じになるため、内部データ形式の国際化の問題について心配する必要はありません。

そうは言っても、これをどこにでも指定することにはいくつかの利点があります-主に、これを正しく処理していることを確認するように強制するという点で。内部プログラム作業とUI作業では、異なるカルチャを指定する必要があります(アプリケーションを適切にローカライズする場合)。その結果、「デフォルト」のままにしておくことはせいぜい危険であり、時間の経過とともにバグが発生する傾向があるため、複雑なプログラムではどこでもこれを指定する必要があります。

ただし、お気づきのとおり、これを指定すると、コードのサイズが大きくなり、読みやすさが低下する可能性があります。これはトレードオフにつながります-より短いコードによる可読性と保守性と、どこでもより明確にすることによる適切な国際化とローカリゼーションと保守性。

私の意見では、ここに「正しい」答えはありません-それは本当にあなたのアプリケーションに依存します。アプリケーションが完全にプレゼンテーションに関するものであり、多くのデータ操作を行わない場合、特に自己管理型ファイルストレージを使用しない場合は、現在のカルチャ(およびUIカルチャ)を一度設定するだけで問題ない場合があります。より複雑なアプリケーションはこの方法ではうまく機能しない傾向があることがわかりましたが、その場合、これをどこにでも指定するというFxCopの提案の方が魅力的です。

于 2010-07-12T19:16:18.997 に答える
5

デフォルトは、Windowsによって初期化された現在のカルチャです。したがって、CultureInfo.CurrentCultureを明示的に使用することは、時間の無駄です。適切なシリアル化形式(バイナリシリアル化とXMLシリアル化を含む)は、カルチャに依存しない方法でDateTimeをシリアル化します。

デフォルトではないカルチャを使用することは非常に危険です。スレッドは常に、Windowsで指定され、ユーザーがWindowsをインストールしたときに構成されたデフォルトのカルチャで開始されます。.NETは常にスレッドプールスレッドを開始します。そのスレッドでメインスレッドとは異なるカルチャを取得するリスクがあります。これはあらゆる種類の微妙な問題を引き起こす可能性があります。突然ソートされなくなったSortedListがあるようなものです。

于 2010-07-12T19:16:20.143 に答える