|
仕様が曖昧であることを指摘しようとしたまま、 回答をつけるのすっかり忘れてました…。
自己解決したようなので「解決済み」マークは付けたままにしておきますが、 投稿用の草稿が残っていたので、以下にそのまま転記しておきます。
--------------
■No92666 (犬夜叉 さん) に返信 > DateTime value = DateTime.Now;
DateTime 型は 100ナノ秒(0.0000001秒)の精度を持つデータ型ですよね。
DateTime.Today ならいざしらず、DateTime.Now を基準とした場合、 「リセットを選択して初期化」した瞬間に過去の日付値になってしまいますが、 それで良いのでしょうか?
DateTime.Now の精度はもう少し粗くて、ミリ秒オーダー(約0.00005〜0.0015秒)程度ですが、 それでも DateTime.Today に比べれば、あまりにも一瞬です。
> プログラムを走らせるたびに現在の日付をデフォルトにしたいのですが > どうすればよいのでしょうか? 最初の質問は「プロパティ ウィンドウを右クリックして、リセットを選択して初期化」だったのに、 その後では「プログラムを走らせるたびに」に変わっています。質問がぶれていますよ。
なにをもって『プログラムを走らせた時』とするのかが不明瞭ですが、 アプリ起動時に常に Now で始めたいなら、そもそもデザイン時に Value プロパティを指定しておくことが無意味なので、永続化を廃してしまえば良いでしょう。
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public DateTime Value { get; set; } = DateTime.Now;
値の設定すら不要で、常に現在の日時を返したいのなら、もっと簡単にこう書けます。 (ここまで来ると、プロパティとして設ける必要があるのかどうかも疑問ですが)
public DateTime Value => DateTime.Now;
デザイン時に指定することは許容するとして、何も指定されていない場合は Now としたいのなら、 No92658 で紹介したとおり、ShouldSerialize パターンを用いることができます。ただその場合、 (1) Value プロパティのリセット後、リセットした時点の Now を返す (2) Value プロパティのリセット後、最初に getter が呼ばれた時点の Now が返される (3) Value プロパティのリセット後、getter が呼ばれるたびにその時点の最新の Now が返される という点が曖昧なので、もう少し仕様をはっきりさせる必要があるでしょう。
以下、ShouldSerialize{プロパティ名} & Reset{プロパティ名} メソッドパターンのサンプル。
public DateTime Value { get => _value ?? DateTime.Now; set => _value = value; } DateTime? _value; private bool ShouldSerializeValue() => _value.HasValue; private void ResetValue() => _value = null; //private void ResetValue() => _value = DateTime.Now;
|