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

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

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

有一个解决方法,利用可空types和null是一个编译时常量的事实。 (虽然这有些破绽,但我build议避开它,除非你真的做不到。)

 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 } 

我会稍微修改LukeH的解决scheme:

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

这看起来更短,更可读。

我想你并不是真的想要addedOn = DateTime.Now因为这会build议你永远不会得到任何结果,因为所有的东西都会在'Now'之前被添加。 🙂

默认的DateTime可以像这样设置:

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

更新
如果您处理SQL Server,不要忘记它不接受默认(DateTime)什么是1/1/0001。 SQL Server的最小DateTime是1/1/1753( 解释 )。 虽然SQL的DateTime2接受1/1/0001。

不要使用可选参数:

 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 } 

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

或者甚至是来自macros伟的答案的空检查/空值参数。

干杯安东尼。

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