96

如何在可选参数中设置 DateTime 的默认值?

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

6 回答 6

154

有一个解决方法,利用可为空的类型和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。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 确实有可选参数。(谷歌也是你的朋友,在这里。)

编辑(因为安东尼佩格拉姆正确,评论)......

是的,这就是你要做的。

但是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 
}

甚至是来自慷慨的答案的空值检查/空值参数。

干杯安东尼。

于 2010-06-13T04:53:59.707 回答
2

从这个意义上说,C# 没有可选参数。如果您想使其成为addedOn可选,您应该编写一个不需要该参数的重载,并传递DateTime.Now给两个参数的版本。

于 2010-06-13T04:50:41.947 回答