【问题标题】:Does default keyword create new instance? [duplicate]默认关键字是否创建新实例? [复制]
【发布时间】:2020-06-18 05:58:14
【问题描述】:
if(new DateTime() == default(DateTime))
{
  //blah blah...
}

代码“new DateTime()”将创建新实例并为自己占用一些内存。

我想知道代码'default(DateTime)'也创建新实例并占用一些内存或只是比较然后结束

【问题讨论】:

  • 对于值类型,它调用 CIL initobj,它将指定地址处的值类型的每个字段初始化为空引用或适当原始类型的 0 并将其推入堆栈,是的...它是否使用内存?是的,你能用完堆栈内存吗?是的。您是否应该担心这一点,可能不在您的示例中。
  • @SelimYıldız 这个问题只是 'default(DateTime)' 分配一些内存,而不是 'default(DateTime) == new DateTime' 是真还是假。谢谢
  • 你检查过stackoverflow.com/a/13957724/5519709那个问题的答案了吗?我认为这也可以回答你的问题,上面写着default(), for any value type (DateTime is a value type) will always call the parameterless constructor.
  • @SelimYıldız 好的,我明白了
  • @Selim um... C# 几乎没有(我想说“从不”,但我懒得使用 ilasm 来编写一个值类型一个显式的无参数构造函数,看看它做了什么)“调用无参数构造函数”用于值类型 - 通常,它使用initobj IL 指令 - 它当然适用于DateTime

标签: c#


【解决方案1】:

如此处所述,它创建了一个新的默认值。因此,它与值类型和引用类型的内存分配相同。第一个在堆栈上第二个在堆上

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/default#default-literal

【讨论】:

    【解决方案2】:

    对于值类型,它设置为零,例如默认 int 为 0。对于引用类型,默认值为 null。

    详情请参阅docs

    由于 DateTime 是一种值类型,它将被分配在堆栈上,而不是堆上。它只会占用当前堆栈帧内的内存,或者它是类的成员。

    【讨论】:

      猜你喜欢
      • 2015-05-22
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多