繁体   English   中英

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

[英]What the purpose of this = default(…) in struct constructor?

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

查看.NET核心的示例:

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

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

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

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

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

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

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

它满足struct构造函数的要求:

如果结构实例构造函数没有指定构造函数初始化时, this变量对应于结构类型的输出参数,以及类似的输出参数, this必须被明确在每个位置分配(第5.3节),其中构造函数返回

C#语言规范,第5版 ,第11.3.8节

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


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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM