在构造函数中,这个= default(...)的目的是什么?

时间:2014-02-20 07:54:37

标签: c# .net

在研究期间this重新分配结构的可能性的目的我遇到了以下难题:为什么需要在某个结构构造函数的开头做this = default(...)。它实际上是零已经归零的内存,不是吗?

请参阅.NET核心中的示例:

public CancellationToken(bool canceled)
{
    this = default(CancellationToken);
    if (canceled)
    {
        this.m_source = CancellationTokenSource.InternalGetStaticSource(canceled);
    }
}

2 个答案:

答案 0 :(得分:11)

  

实际上零已经归零了内存,不是吗?

没有。当您为struct创建自定义构造函数时,您有责任将struct的每个字段设置为某个值。

只是默认.ctor()会用零填充它 - 这就是为什么你不允许在C#中为struct实现自己的默认.ctor的原因之一(而CLR在技术上允许它,但它&# 39;讨论的主题不同。)

这里的技巧是调用default(),当使用' this ='时,会创建用零填充的单独实例。赋值将从右到左复制所有字段(因为它是struct),这将满足您初始化struct的每个字段的需要。然后,你可以做任何你想做的事。

在大多数情况下,使用类似的东西可能会更好(从代码可读性):

public MyStruct(..) : this() {
...
}

答案 1 :(得分:3)

满足struct构造函数的要求:

  

如果struct实例构造函数未指定构造函数初始值设定项,则this变量对应于struct类型的out参数,并且类似于out参数,this必须明确赋值( §5.3)在构造函数返回的每个位置

C# Language Spec, Version 5,第11.3.8节

当然,它不一定是default() - 它可以是任何东西。但this 必须分配。


明确指配的规则(参见上文第5.3节)部分说明:

  

结构类型变量的实例变量的明确赋值状态可以单独跟踪,也可以共同跟踪。除上述规则外,以下规则适用于struct-type变量及其实例变量:

     
      
  • 如果实例变量的包含结构类型变量被认为是明确赋值,则认为它是明确赋值的。
  •   
  • 如果结构类型变量的每个实例变量都被认为是明确赋值的,则它被认为是明确赋值的。
  •