如何在可选参数中设置DateTime的默认值?
public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???)
{
//Init codes here
}
答案 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
传递给双参数版本。