new DateTime()vs default(DateTime)

RJP*_*RJP 176 c# datetime default

是否有理由选择其中一个而不是另一个?

DateTime myDate = new DateTime();
Run Code Online (Sandbox Code Playgroud)

要么

DateTime myDate = default(DateTime);
Run Code Online (Sandbox Code Playgroud)

两者都是平等的1/1/0001 12:00:00 AM.

Ser*_*rvy 185

不,他们是完全相同的.

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

  • 有人可能会说`default(DateTime)`更能描述程序员的意图,因此通常更有利. (29认同)
  • FWIW; 在C#6中,此行为将发生变化.C#6为结构体引入了[无参数构造函数](https://roslyn.codeplex.com/discussions/562559),它允许`new`的行为与`default(T)`的行为不同. (28认同)
  • @vcsjones在C#6.0的最终版本之前删除了. (16认同)
  • @nawfal是的.它也可能是最好的. (5认同)

小智 21

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

以下行不会编译:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)
Run Code Online (Sandbox Code Playgroud)

这行将编译:

    private void MyMethod(DateTime syncedTime = default(DateTime))
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*n C 16

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

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

DateTime myDate = new DateTime(1, 1, 1, 0, 0, 0, DateTimeKind.Utc);
Run Code Online (Sandbox Code Playgroud)

myDate.Kind属性是只读的,因此在调用构造函数后无法更改.

  • 请看我的答案的前4个字. (46认同)
  • 我反对这个.默认的`DateTime`作为一个值未设置的值很有用,只需与`default(DateTime)`进行简单的比较.什么用途是非默认的'01/01/0001`值? (4认同)
  • 怎么回答OP的问题? (2认同)