【问题标题】:Struct - Layout.Explicit - Constructor - fully assign fieldsStruct - Layout.Explicit - 构造函数 - 完全分配字段
【发布时间】:2017-06-18 00:58:29
【问题描述】:

如果我使用为什么:

struct MyStruct
{
        [FieldOffset (0)] public uint Data;
        [FieldOffset (0)] public byte Something;
}

public MyStruct (uint pData)
{
   Data = pData; // setting Data field also sets Something field
}

C# 说我需要分配 'Something' 字段:/ 我知道我可以做一个“构造函数:this ()” 但编译器应该知道 'Data' 字段包含 'Something' 字段。

所以,我应该先调用无参数构造函数,这是唯一的方法吗?

【问题讨论】:

    标签: c# struct


    【解决方案1】:

    是的,您需要调用默认构造函数。

    public MyStruct (uint pData) : this()
    {
       //...
    }
    

    然后编译器将在你的构造函数的开头生成以下 IL 指令:

    ldarg.0           // Push address of struct onto stack
    initobj MyStruct  // Pop address of struct and initialize it with "all zeros"
    

    【讨论】:

    • 这非常有用。这样做可以将代码加快一纳秒或多纳秒(取决于字段的数量)。
    【解决方案2】:

    好像不可能,关于它的讨论已经结束了:

    这里是关于这个问题的讨论链接:

    https://github.com/dotnet/roslyn/issues/7323

    【讨论】:

      【解决方案3】:

      如果定义自定义构造函数,则需要初始化结构的所有字段。有关详细信息,请参阅结构中的 this MSDN 教程 - 特别是在构造函数和继承标题下。

      以下是从该链接中提取的与此相关的一段:

      结构可以声明构造函数,但它们必须带参数。为结构声明默认(无参数)构造函数是错误的。结构成员不能有初始化器。始终提供默认构造函数来将结构成员初始化为其默认值。

      【讨论】:

      • 我在说别的。
      • @zgnilec 在这种情况下,我建议您查看您的问题,因为它没有多大意义。
      • 好吧,也许别人会理解我。
      猜你喜欢
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 2023-03-10
      • 2017-06-14
      • 2018-08-17
      相关资源
      最近更新 更多