新的DateTime()与default(DateTime)


196

有理由选择其中之一吗?

DateTime myDate = new DateTime();

要么

DateTime myDate = default(DateTime);

他们俩是平等的1/1/0001 12:00:00 AM


28
等于DateTime.MinValue,因此您也可以这样做DateTime myDate = DateTime.MinValue:/
Lloyd

20
@Lloyd在大多数时间...但不是作为默认参数DateTime.MinValue不是编译时间常数-但default(DateTime)/ new DateTime()是。
里奇博布2014年

12
只是为了阐明@Ricibob的出色注释,因为它很重要:如果要创建带有可选参数的方法,则只能使用default(DateTime)new DateTime()。这些都是编译时间常数,这是可选参数值所必需的。如果不需要编译时间常数,那么default(DateTime)new DateTime()DateTime.MinValue可以互换。
leanne 2014年

Answers:


200

不,它们是相同的。

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


29
FWIW;在C#6中,此行为将改变。C#6引入了用于结构的无参数构造函数,该构造函数允许的行为new不同于default(T)将要执行的操作。
vcsjones 2015年

30
有人可能会说,这default(DateTime)更能说明程序员的意图,因此通常更有利。
intrepidis 2015年

16
@vcsjones在最终发布C#6.0之前已将其删除。
nawfal '16

5
@nawfal是的。大概也是最好的。
vcsjones'7

IMO的答案是错误的:两者在语义上是相同的,但是它们都不调用构造函数-两种语法都使用initobj
Marc Gravell

22

如果要在方法中为DateTime参数使用默认值,则只能使用default(DateTime)。

以下行将无法编译:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

该行将编译:

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

3
当然DateTime.MinValue不能编译?可选参数必须是编译时常量,而MinValue则不是。default(DateTime)和新的DateTime()都有效。(实际上很有趣,因为const DateTime x = default(DateTime)无效,因为不能将DateTime值声明为编译时常量)
Jerri Kangasniemi

16

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

因此,最好执行以下操作:

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

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


2
那如何回答OP的问题?
Mo Patel 2014年

46
请查看我的答案的前4个字。
2014年

4
我反对这个。该默认DateTime值可用作“未设置值”,与进行简单比较default(DateTime)。非默认01/01/0001值有什么用?
罗林

请记住,它是DateTimeKind.Utc而不是DateTimeKind.UTC
罗伯托

@Roberto谢谢,固定。
jpaugh

-3

理解它的最简单方法是DateTime是一个结构。初始化结构时,它会初始化为最小值:DateTime.Min

因此,default(DateTime)new DateTime()和之间没有区别DateTime.Min


3
不,结构是不是一定初始化为其最小值。它们被初始化为所有位为零。对于某些类型,这是它们的最小值,对于其他类型,例如可以为负数的数字类型,它不可能接近其最小值。当然,其他人仍然无法与之相比,也不会具有 “最低”价值。
Servy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.