C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

プロパティのリセットの対応方法

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■92656 / inTopicNo.1)  プロパティのリセットの対応方法
  
□投稿者/ 犬夜叉 (22回)-(2019/10/18(Fri) 13:45:57)

分類:[.NET 全般] 

VisualStudio の C# で
ユーザーコントロールを作成しています。

プロパティ DateTime 型の Value を作ったのですが
プロパティウィンドウでこの Value を右クリックして
リセットを選択して初期化できるようにするにはどうすればよいのでしょうか?



引用返信 編集キー/
■92658 / inTopicNo.2)  Re[1]: プロパティのリセットの対応方法
□投稿者/ 魔界の仮面弁士 (2427回)-(2019/10/18(Fri) 14:21:50)
No92656 (犬夜叉 さん) に返信
> プロパティウィンドウでこの Value を右クリックして
> リセットを選択して初期化できるようにするにはどうすればよいのでしょうか?

固定値なら、DefaultValue 属性を付与します。
他のプロパティとの組み合わせで値が決まるような場合は、
ShouldSerialize & Reset メソッドパターンを使います。
(これらのメソッドは public にしなくても構いません)

初期値と既定値の違いにも注意してください。

https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/controls/defining-default-values-with-the-shouldserialize-and-reset-methods?WT.mc_id=DT-MVP-8907
引用返信 編集キー/
■92659 / inTopicNo.3)  Re[2]: プロパティのリセットの対応方法
□投稿者/ Hongliang (901回)-(2019/10/18(Fri) 14:24:47)
DefaultValue属性にはリテラル値しか書けないので、リテラルを書けないDateTimeだとReset***/ShouldSerialize***一択ですね。
引用返信 編集キー/
■92666 / inTopicNo.4)  Re[2]: プロパティのリセットの対応方法
□投稿者/ 犬夜叉 (24回)-(2019/10/18(Fri) 15:29:37)
No92658 (魔界の仮面弁士 さん)
No92659 (Hongliang さん)
ありがとうございます。
どうすればよいのかわかりませんでした。

現在以下のようになっています。
貼り付けた時の日付のままで動作します。
DateTimePicker のように
プログラムを走らせるたびに現在の日付をデフォルトにしたいのですが
どうすればよいのでしょうか?


DateTime value = DateTime.Now;

#region 【プロパティ】Value:データ
public DateTime Value
{
 get { return (value); }
 set {
  DateTime oldtime = this.value;
  this.value = value;
 }
}
#endregion
引用返信 編集キー/
■92738 / inTopicNo.5)  Re[3]: プロパティのリセットの対応方法
□投稿者/ 犬夜叉 (26回)-(2019/10/28(Mon) 09:01:44)
No92666 (犬夜叉 さん) に返信
> No92658 (魔界の仮面弁士 さん)
> No92659 (Hongliang さん)
> ありがとうございます。
> どうすればよいのかわかりませんでした。
>
> 現在以下のようになっています。
> 貼り付けた時の日付のままで動作します。
> DateTimePicker のように
> プログラムを走らせるたびに現在の日付をデフォルトにしたいのですが
> どうすればよいのでしょうか?
>
>
> DateTime value = DateTime.Now;
>
> #region 【プロパティ】Value:データ
> public DateTime Value
> {
>  get { return (value); }
>  set {
>   DateTime oldtime = this.value;
>   this.value = value;
>  }
> }
> #endregion
解決済み
引用返信 編集キー/
■92743 / inTopicNo.6)  Re[4]: プロパティのリセットの対応方法
□投稿者/ 魔界の仮面弁士 (2437回)-(2019/10/28(Mon) 10:27:43)
仕様が曖昧であることを指摘しようとしたまま、
回答をつけるのすっかり忘れてました…。

自己解決したようなので「解決済み」マークは付けたままにしておきますが、
投稿用の草稿が残っていたので、以下にそのまま転記しておきます。

--------------

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;
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ