ReSharperのベータ版を実行していますが、次のコードに対して警告が表示されます。
_int id;
// ...
DoSomethingWith(id.ToString());
_
警告はid.ToString()
呼び出しにあり、「文字列変換でカルチャを明示的に指定してください」と言っています。私は警告を理解し、それを修正する方法を知っています-コードをはるかに扱いにくいid.ToString(CultureInfo.InvariantCulture)
に変更するだけです。
しかし、私の質問は:それは必要ですか?つまり、DateTime
(異なるカルチャには異なる日付形式があります)やDouble
(小数点に使用される異なる文字)などのタイプを使用している場合は、明らかにカルチャを指定することが重要です。しかし、少なくともen-USおよび不変のカルチャでは、Int32.ToString()
はまったくフォーマットを追加しません。コンマ、小数点、ドル記号、なし。では、文化によって何が変わるのでしょうか?
パラメーターレスInt32.ToString()
を呼び出すときに、実際にadd何らかの形式のカルチャがありますか?または、これはReSharperベータのバグであり、この警告は_Int32
_に実際には適用されません(この場合、ReSharperバグレポートを提出します)。
オペレーティングシステムでは、数字の負符号を変更できます。
Control panel ->
Language and regional settings ->
Additional settings ->
Negative sign
そのため、現在の文化は否定的な兆候を覆したかもしれません。この場合、地域の設定を尊重する必要があります。これが警告の理由です。プログラムで負符号を変更することもできます:
CultureInfo culture = Thread.CurrentThread.CurrentCulture;
// Make a writable clone
culture = (CultureInfo) culture.Clone();
culture.NumberFormat.NegativeSign = "!";
Intのランダムサンプルでテストしたように、Windowsでインストールされたすべての352カルチャ(CultureTypes.InstalledWin32Cultures
)同じ結果が得られます。
ダニエルは、カスタムカルチャが負の数に異なるプレフィックスを使用する可能性があることに注意するのは正しいですが、偶然保存してこの機能を使用した人はいないでしょう。
.NET開発者は、floatや他の型との一貫性を保つためにそれを行ったと思います。彼らは他に何を期待していましたか?
> int.MaxValue.ToString(CultureInfo.AncientRome)
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM....
はい。現在の文化に依存します。 MSDNドキュメント から:
戻り値は、一般的な数値書式指定子( "G")および現在のカルチャのNumberFormatInfoオブジェクトで書式設定されます。
重点鉱山
Resharperは、ほとんどの場合、どの文化を使用するつもりであるかを明確にすることを望んでいます。省略するのは、異なるマシンで実行すると変化する可能性のある動作に依存しているためです。
それは奇妙だ; 50.ToString(CultureInfo.CreateSpecificCulture( "ar-AE"))が "٥٠"を返すと予想していましたが、そうではありません。
私はこれを調べたところ、問題はNumberFormatInfo.DigitSubstitution 実際には実装されていません
DigitSubstitutionプロパティは、将来の使用のために予約されています。現在、現在のNumberFormatInfoオブジェクトの解析操作またはフォーマット操作では使用されていません。
そのため、列挙System.Globalization.DigitShapesがありますが、実際にはIFormatProviderのNumberFormatInfoビットに実装されていません。
私はノーと言っていたでしょうが、MSDN Int32.ToString()をチェックするとこれがあります:
戻り値は、一般的な数値書式指定子( "G")および現在のカルチャのNumberFormatInfoオブジェクトで書式設定されます。
だから驚きがあります。
問題は、現在のResharperがなぜこれを示唆しないのかということです。