【问题标题】:What the purpose of this = default(...) in struct constructor?struct 构造函数中 this = default(...) 的目的是什么?
【发布时间】:2014-03-21 00:35:34
【问题描述】:

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

查看 .NET core 的示例:

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

【问题讨论】:

  • C# Structs "this = ...." 的可能副本。 big Jon 已经回答了。
  • @Adriano:Jon 没有说任何关于在其自己的构造函数中使用自身的 default() 初始化结构。
  • @Adriano 你在说什么?
  • @BoltClock IMO 这个问题中的 引号this 赋值本身,default() 所做的应该不是问题。
  • @Adriano:很公平。 FWIW,似乎有一个更相似的问题,基于这个特定结构源的不同版本,它使用new而不是default重新分配-stackoverflow.com/questions/5562908/…

标签: c# .net


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    如果struct实例构造函数没有指定构造函数初始化器,this变量对应struct类型的out参数,和out参数类似,this必须明确赋值(§5.3)构造函数返回的每个位置

    C# Language Spec, Version 5,第 11.3.8 节

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


    明确分配的规则(来自上面引用的第 5.3 节)部分说明:

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

    • 如果一个实例变量包含的结构类型变量被认为是确定分配的,那么它就被认为是确定分配的。
    • 如果结构类型变量的每个实例变量都被认为是确定分配的,那么它就被认为是确定分配的。

    【讨论】:

    • 你是不是想说每个struct的构造函数都必须做这个赋值?这不是真的,只需检查例如Guid 或 DateTime 实现。
    • @EugeneD.Gubenkov - 刚刚更新。满足必须分配this 的要求。不必使用default()
    • @EugeneD.Gubenkov - 另外,不执行此类赋值的 GuidDateTime 构造函数正在利用我添加的明确赋值规则中的第二个项目符号。而您正在查看的构造函数并不总是分配给m_source
    猜你喜欢
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 2021-06-20
    • 2019-12-07
    相关资源
    最近更新 更多