2012-12-19 60 views
132

是否有理由选择其中之一?新DateTime()与默认(DateTime)

DateTime myDate = new DateTime(); 

DateTime myDate = default(DateTime); 

他们两人都是相等1/1/0001 12:00:00 AM

+26

等于'DateTime.MinValue',所以你也可以只做到'日期时间指明MyDate =日期时间.MinValue':/ – Lloyd

+13

@Lloyd大部分时间......但不是默认参数DateTime.MinValue不是一个编译时间常量 - 但是默认的(DateTime)/ new DateTime()是。 – Ricibob

+7

只是为了澄清@ Ricibob的优秀评论,因为它很重要:如果您使用可选参数创建方法,则只能使用'default(DateTime)'或'New DateTime()'。这些都是*编译时间常量*,对于可选参数值是必需的。如果不需要编译时间常量,那么'default(DateTime)','new DateTime()'和'DateTime.MinValue'是可以互换的。 – leanne

回答

139

不,它们是相同的。

default(),对于任何值类型(DateTime是一个值类型)将始终调用无参数构造函数。

+22

FWIW;在C#6中,这种行为将会改变。 C#6为结构引入了[无参数构造函数](https://roslyn.codeplex.com/discussions/562559),它允许'new'的行为不同于'default(T)'的行为。 – vcsjones

+19

有人可能会认为'default(DateTime)'更能描述程序员的意图,因此通常更有利。 –

+8

@vcsjones然而,在C#6.0的最终发布之前,它已被删除。 – nawfal

13

答案是否定的。请记住,在这两种情况下,mdDate.Kind = DateTimeKind.Unspecified

因此它可能是更好的做到以下几点:

DateTime myDate = new DateTime(1, 1, 1, 0, 0, 0, DateTimeKind.Utc); 

myDate.Kind属性是只读的,所以构造函数被调用后,不能更改。

+2

如何回答OP的问题? –

+32

请查看我答案的前4个单词。 –

+2

我会反驳这个。默认的'DateTime'作为一个未设置值的值非常有用,只需比较'default(DateTime)'。什么用途是非默认的'01/01/0001'值? – Rawling

16

如果您想在方法中使用DateTime参数的默认值,则只能使用默认值(DateTime)。

下面的行不会编译:

private void MyMethod(DateTime syncedTime = DateTime.MinValue) 

此行将编译:

private void MyMethod(DateTime syncedTime = default(DateTime)) 
+0

这就是我正在寻找的答案。谢谢! – GigaKatowice

+0

当然DateTime.MinValue不能编译?可选参数必须是编译时常量,而MinValue不是。虽然Date(DateTime)和new DateTime()都是有效的(这实际上很有趣,因为DateTime值x = default(DateTime)无效,因为DateTime值不能被声明为编译时常量) –