96

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

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

6 に答える 6

154

これには、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
}
于 2010-06-13T06:28:31.010 に答える
48

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

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

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

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

于 2012-06-20T02:34:18.573 に答える
28

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

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

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

于 2011-07-25T08:15:50.623 に答える
8

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

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
}
于 2010-06-13T04:52:11.190 に答える
5

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

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

そして、はい、それはあなたがそれを行う方法です。

しかし、DateTime.今(そのクラスの静的プロパティ)は実行時までわかりません。そのため、それをオプションの値として使用することはできません。

.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 
}

または、munificent の回答からの null チェック/null 値パラメーターでさえ。

乾杯アンソニー。

于 2010-06-13T04:53:59.707 に答える
2

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

于 2010-06-13T04:50:41.947 に答える