【问题标题】:new DateTime() vs default(DateTime)新日期时间()与默认(日期时间)
【发布时间】:2012-12-07 02:51:23
【问题描述】:

是否有理由选择其中之一?

DateTime myDate = new DateTime();

DateTime myDate = default(DateTime);

两者相等1/1/0001 12:00:00 AM

【问题讨论】:

  • 等于DateTime.MinValue,所以你也可以只做DateTime myDate = DateTime.MinValue :/
  • @Lloyd 大多数时候......但不是作为默认参数 DateTime.MinValue 不是编译时间常数 - 但 default(DateTime)/new DateTime() 是。
  • 只是为了澄清@Ricibob 的出色评论,因为它很重要:如果您正在创建一个带有可选参数的方法,您只能使用default(DateTime)new DateTime()。这两个都是编译时常量,是可选参数值所必需的。如果不需要编译时常量,则default(DateTime)new DateTime()DateTime.MinValue 可以互换。

标签: c# datetime default


【解决方案1】:

不,它们是相同的。

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

【讨论】:

  • FWIW;在 C# 6 中,这种行为将会改变。 C# 6 为结构引入了parameterless constructors,它允许new 的行为与default(T) 的行为不同。
  • 有人可能会说default(DateTime) 更能描述程序员的意图,因此通常更有利。
  • @vcsjones 然而,这在 C# 6.0 最终版本之前已被删除。
  • @nawfal 是的。可能也是最好的。
  • @MarcGravell 从语言的角度来看,一个无参数的构造函数。语言运行时的一种实现对其进行了优化并不会改变这一点。 new DateTime() 确实 的意思是“调用无参数构造函数”,即使 MS CLR 实现它的方式与使用带参数的构造函数完全不同,并且如果运行时碰巧实际上没有无参数构造函数那种类型。
【解决方案2】:

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

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

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

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

【讨论】:

  • 这如何回答 OP 的问题?
  • 请看我回答的前4个字。
  • 我反对这一点。默认的DateTime 可用作值未设置的值,与default(DateTime) 进行简单比较。非默认的01/01/0001 值有什么用?
  • 记住它是 DateTimeKind.Utc 而不是 DateTimeKind.UTC
  • @Roberto 谢谢,已修复。
【解决方案3】:

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

以下行将无法编译:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

这一行将编译:

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

【讨论】:

  • 当然 DateTime.MinValue 不能编译?可选参数必须是编译时常量,而 MinValue 不是。 default(DateTime) 和 new DateTime() 都有效。(这实际上很有趣,因为 const DateTime x = default(DateTime) 无效,因为 DateTime 值不能声明为编译时常量)
【解决方案4】:

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

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

【讨论】:

  • 不,结构不一定必须初始化为它们的最小值。它们被初始化为所有位为零。对于某些类型,这是它们的最小值,对于其他类型,例如可能为负数的数字类型,它远不接近它们的最小值。当然,其他的仍然无法比较,也不会“最小”值。
猜你喜欢
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2010-10-22
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多