结构指针(地址)和默认构造函数



获取 C# 结构的地址是否会导致默认构造函数调用?

例如,我得到了这样的结构:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct HEADER {
    public byte OPCODE;
    public byte LENGTH;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct S {
    public HEADER Header;
    public int Value;
}

然后,当然,我不能这样做:

S s;                // no constructor call, so...
var v = s.Value;    // compiler error: use of possibly unassigned field 'Value'

但是一旦我获得了指向结构的指针,即使不使用指针,我也可以读取它的字段,甚至是嵌入结构的字段:

S s;
S* ps = &s;
var v1 = ps->Value;        // OK, expected
var v2 = s.Value;          // OK!
var len = s.Header.LENGTH; // OK!

那么,它是否以某种方式调用默认构造函数,或者 - 一旦我获取地址 - C# 就不再关心内存?

PS:无论如何,内存似乎已初始化为零。

获取 C# 结构的地址是否会导致默认构造函数调用?

不。它只是绕过编译器检查。

"使用可能未分配的字段"是保护您免受自己侵害的好方法。但它可以很容易地解决。在这种情况下,它似乎并不那么重要。

PS:无论如何,内存似乎已初始化为零。

是的,在 .NET 中几乎总是如此(见下文(,这使得"默认构造函数调用"问题有点学术性。内存中发生的情况与编译器警告并不紧密耦合。

相关内容

  • 没有找到相关文章

最新更新