web-dev-qa-db-ja.com

オプションのパラメーターでDateTimeのデフォルト値を設定する

オプションのパラメーターでDateTimeのデフォルト値を設定するにはどうすればよいですか?

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???)
{
    //Init codes here
}
78
Sadegh

この問題を回避するには、null許容型とnullがコンパイル時定数であるという事実を利用します。 (ただし、これはちょっとしたハックです。本当にできない場合を除き、回避することをお勧めします。)

public void SomeClassInit(Guid docId, DateTime? addedOn = null)
{
    if (!addedOn.HasValue)
        addedOn = DateTime.Now;

    //Init codes here
}

一般的に、他の回答で提案されている標準的なオーバーロードアプローチを好むでしょう。

public SomeClassInit(Guid docId)
{
    SomeClassInit(docId, DateTime.Now);
}

public SomeClassInit(Guid docId, DateTime addedOn)
{
    //Init codes here
}
121
LukeH

あなたは本当にaddedOn = DateTime.Nowこれは、「今」の前にすべてが追加されるため、結果が得られないことを示唆するためです。 :)

デフォルトのDateTimeは次のように設定できます。

public void SomeClassInit(Guid docId, DateTime addedOn = default(DateTime))

更新
SQL Serverを扱う場合は、1/1/0001のdefault(DateTime)を受け入れないことを忘れないでください。 SQL Serverの最小のDateTimeは1/1/1753です( 説明 )。ただし、SQLのDateTime2は1/1/0001を受け入れます。

32
Rick Glimmer

LukeHのソリューションを次のように少し変更します。

public void SomeClassInit(Guid docId, DateTime? addedOn = null)
{
    DateTime TargetDateTimeProperty = addedOn ?? DateTime.Now;
}

短くて読みやすいようです。

24

オプションのパラメーターを使用しないでください。

public SomeClassInit(Guid docId, DateTime addedOn)
{
    SomeClassInitCore(docId, addedOn);
}

public SomeClassInit(Guid docId)
{
    SomeClassInitCore(docId, null);
}

private SomeClassInitCore(Guid docId, DateTime? addedOn)
{
    // set default value
    if (addedOn.IsNull) addedOn = DateTime.Now;

    //Init codes here
}
5
munificent

。NET 4.0にはオプションのパラメーターがあります 。 ( googleもあなたの友達です 、こちら。)

編集(Anthony Pegramが正しいため、コメント)...

そして、そう、それがあなたのやり方です。

しかし、DateTime.Now(そのクラスの静的プロパティ)は、run-time。そのため、それをオプションのvalueとして使用することはできません。

.NET 3.5は...ではないので、JS Bangsが言ったことをしなければならないでしょう...

public SomeClassInit(Guid docId) 
{ 
    return SomeClassInit(docId, DateTime.Now);
}

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???) 
{ 
    //Init codes here 
}

または、無許可の回答からのnullチェック/ null値パラメータです。

乾杯アンソニー。

4
Pure.Krome

この意味で、C#にはオプションのパラメーターはありません。 addedOnをオプションにする場合は、そのパラメーターを必要としないオーバーロードを作成し、DateTime.Nowを2引数バージョンに渡します。

2
JSBձոգչ