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

时间:2010-06-13 04:47:32

标签: c# datetime default optional-parameters

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

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

6 个答案:

答案 0 :(得分:119)

有一种解决方法,利用可空类型以及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
}

答案 1 :(得分:29)

我猜你真的不想要addedOn = DateTime.Now,因为那会暗示你永远不会得到任何结果,因为所有内容都会在'Now'之前添加。 :)

默认DateTime可以像这样设置:

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

<强>更新
如果你处理SQL Server,不要忘记它不接受默认(DateTime)是什么是1/1/0001。 SQL Server的最小DateTime是1/1/1753(explanation)。但是,SQL的DateTime2接受1/1/0001。

答案 2 :(得分:23)

我稍微修改了LukeH的解决方案:

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

似乎更短,更易读。

答案 3 :(得分:4)

请勿使用可选参数:

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
}

答案 4 :(得分:4)

.NET 4.0 does have optional parameters。 (google is also your friend,这里。)

编辑(因为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 checking / null值参数。

干杯安东尼。

答案 5 :(得分:2)

在这个意义上,C#没有可选参数。如果要使addedOn可选,则应编写不需要该参数的重载,并将DateTime.Now传递给双参数版本。