3

オブジェクトを文字列に格納するとき、キャストバックが正常に実行されることを保証できますか?

DateTime dt = DateTime.UtcNow;
string pattern = dt.ToString();
DateTime retDt = DateTime.Parse(pattern);

この質問は、次のオブジェクト タイプについて尋ねています。

  • 期間
  • 日付時刻
  • 整数
  • 長いです
  • 浮く
  • ダブル

私はいくつかのフォーラムを読んでみましたが、矛盾する例は見当たりませんでした。また、コードからまだ例外を取得していませんが、考えられるすべての入力/シナリオを試していないことは確かです。

4

3 に答える 3

2

を使用すると、数値と時間ToStringの形式を指定できます (詳細については、このトピックを参照してください)。

これらの多くの場合に使用する形式は、往復形式 (Single、Double、および BigInteger 型の場合は "R"、DateTime の場合は "O") です。この形式は、すべての情報が文字列に渡されることを保証し、まったく同じデータに解析されます。

IFormatProviderto を渡すことToStringは、ロケールの問題を回避するためにも不可欠です (たとえば、異なるロケールでは小数点記号に異なる文字を使用できます)。 static を使用すると、CultureInfo.InvariantCultureこの問題が解決します。

最後に、データを永続化してから取得しようとしている場合は、クラス全体を取得してさまざまな形式に書き込む serializer の使用検討することをお勧めします。.NET にはいくつかのシリアライザーがあり、最も有名なものの 2 つは(バイナリ) と(XML) です。BinaryFormatterDataContractSerializer

于 2013-09-22T08:52:59.050 に答える
1

ToStringこれらの型の既定の実装を使用する場合、カルチャ固有の設定が機能することに注意する必要があります。

シリアル化を実行したのと同じマシンで常に逆シリアル化する場合、問題にはなりません (ユーザーがシリアル化と逆シリアル化の間でカルチャ設定を変更できる場合を除きます)。

別のマシンで逆シリアル化する場合は、カルチャ インバリアント表現の使用を試みる必要があります。ToStringこれらすべての型には、フォーマット指定子を取るオーバーロードがあります。残念ながら、カルチャ インバリアント指定子はすべてわずかに異なります。数値型の場合は "r" ("往復" 形式) です。の場合DateTimeは「お」です。それTimeSpanは「c」だからです。通常、Parseメソッドは現在のカルチャ形式または不変形式を受け入れます。ParseExactメソッドに注意してください。

于 2013-09-22T08:52:04.160 に答える
1

Parse と ToString が選択した型との間で変換できるかどうかは、それらの実装によって異なります。デフォルトでは、変換は変更なしで機能します。

ただし、ToString を使用してタイムゾーン情報を出力するように指定したい場合があるため、DateTime には注意してください。これにより、解析によって正しいタイム ゾーン情報を使用して新しい DateTime が作成されます。

于 2013-09-22T08:32:30.887 に答える