2010-06-13 38 views
61

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

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

这不是重复的Timespans在c#中的工作方式与时间跨度不同。这是可以在C#中用'DateTimeConstantAttribute'实现的,但时间跨度不支持这个。 – leat 2017-05-04 20:56:01

回答

97

有一个解决方法,利用可空类型和事实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

我不明白为什么可选参数必须是编译时常量。编译器可以很容易地创建你使用可选参数编​​写的两个方法......我通常更喜欢使用一个可选的参数而不是几个方法的方法,它使代码更小,因此更易于阅读。 – user276648 2012-05-22 08:48:02

+6

你可以在这里使用coalesce:'addedOn = addedOn ?? DateTime.Now' – 2012-09-19 20:36:48

+0

可能会导致代码深处的投射问题,所以我不是粉丝。我在C#中越来越失望。我的意思是,即使VB.net有文字日期,如:可选addedOn As DateTime =#12:00:00 PM# – Brain2000 2014-03-03 17:40:44

2

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

+1

呃..当然是那个JS Bangs?对于框架版本.NET 3.5及更低版本,您是正确的。否则,4.0及以上版本支持。 – 2010-06-13 04:54:51

+1

@ Pure.Krome,可选参数的默认值必须是编译时间常量。所以这是*不支持。 (然而,这个答案可能措辞更好。) – 2010-06-13 04:57:51

+1

我也误解了措辞。 soz JS。 – 2010-06-13 05:09:15

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

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

EDIT(因为安东尼Pegram正确,评论)...

是的,这是你会怎么做。

DateTime.现在(静态属性,这个类的)不知道,直到运行时。因此,您不能将其作为可选的

.NET 3.5不...这样的话,你会做什么JS邦斯说...

public SomeClassInit(Guid docId) 
{ 
    return SomeClassInit(docId, DateTime.Now); 
} 

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

甚至零检查/空值从优厚的答案参数。

干杯安东尼。

+0

默认值必须是编译时间常量,所以即使在4.0中也不会运行。 – 2010-06-13 04:58:38

+0

确认Anothony。我会重新编辑我的帖子。干杯。 – 2010-06-13 05:03:02

21

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

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

这是短,更具可读性,它似乎。

19

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

默认DateTime可以这样设置:

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

更新
如果你处理SQL Server中,不要忘了,它不接受默认设置(日期时间)什么是1/1/0001。 SQL Server的最小日期时间为1/1/1753(explanation)。虽然SQL的DateTime2接受1/1/0001。

+0

不明白为什么这不标记为答案,它允许更容易处理日期时间,因为日期时间? != datetime – user3800527 2017-07-11 08:57:52

+0

这是正确的答案。 – 2017-10-12 10:11:28

+0

我只是想表达别人的意见,这是正确的答案。其他人基本上只是在欺骗系统。 – CyberClaw 2018-01-17 15:42:02