4

私たちの製品のいくつかのアセンブリで FxCop を実行しようとしましたが、"Specify IFormatProvider" ルールに非常に多くの一致が得られました。

たまたま、それらのいくつかは正当なものですが、次のようなコードにも一致します。

Logger.DebugFormat("Appending file {0}", fileName);

次のように書くことができます

Logger.DebugFormat(CultureInfo.InvariantCulture, "Appending file {0}", fileName);

2 番目のバリアントは、はるかに読みにくいものです。

では、常に指定することが実際に推奨IFormatProviderされるのでしょうか、それともルールで使用されるヒューリスティックの「単なる」制限なのでしょうか?

4

3 に答える 3

6

オーバーロードのあるメソッドにのみ適用されますIFormatProvider

この問題に対処するために、不変のカルチャと現在のカルチャでそれぞれ文字列を処理する2つの静的クラスInvariantTextとがあります。CulturedTextたとえば、各クラスにFormatメソッドがあります。IFormatProviderこのようにして、毎回指定しなくても、カルチャに依存しない、カルチャに対応したフォーマットを実行できます。

例:

InvariantText.Format("0x{0:X8}",value);

CulturedText.Format("Appending file {0}",file);

InvariantText.FormatCulturedText.Formatは単にString.Formatメソッドのラッパーであり、したがって同様に文字列を返します。


このパターンを使用して、カルチャに依存しない、カルチャ固有の文字列を必要とする他の関数をラップすることもできます。たとえば、2つのメソッドを作成し、InvariantLogそれが質問のCulturedLog呼び出しをラップし、それぞれの場合Logger.DebugFormatに適切なものを取ります。IFormatProvider

于 2011-08-08T10:02:12.140 に答える
2

場合によります。アプリケーションがどこでどのように使用されるかを知っているので、MSDNの推奨事項に従うことを検討してください。

  1. 値がユーザーに表示される場合は、現在のカルチャを使用します。System.Globalization.CultureInfo.CurrentCultureを参照してください。
  2. 値がソフトウェアによって保存およびアクセスされる場合(ファイルまたはデータベースに永続化される場合)、不変のカルチャを使用します。System.Globalization.CultureInfo.InvariantCultureを参照してください。
  3. 値の宛先がわからない場合は、データコンシューマーまたはプロバイダーにカルチャを指定してもらいます。

PS:私はFxCop、3番目のルールに従い、適切な文化を自分で指定できると信じています。

于 2011-08-08T10:00:31.060 に答える
1

ルールは、コードの唯一のリーダーではありません。フォーマットカルチャを明示的に指定しない場合、メンテナンス開発者は、デフォルトのフォーマットカルチャ(ほとんどの場合CurrentCulture)への意図的なフォールバックと、誤ったフォーマットにつながる可能性のある省略を区別できません。冗長性が気に入らない場合は、PeterOによって提案されたようなラッパーメソッドの使用を検討してください。

于 2011-08-08T13:52:55.607 に答える