结构-布局.显式-构造函数-完全分配字段

本文关键字:分配 字段 构造函数 布局 显式 结构 | 更新日期: 2023-09-27 18:23:49

为什么我使用:

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"字段:/我知道我可以做一个"Constructor:this()"但编译器应该知道"Data"字段包含"Something"字段。

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

结构-布局.显式-构造函数-完全分配字段

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

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"

似乎这是不可能的,关于它的讨论已经结束:

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

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

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

以下是从该链接中提取的一段内容:

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