结构指针(地址)和默认构造函数
Struct pointer (address), and default constructor
获取 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: 内存似乎是零初始化的。
Does taking address of a C# struct cause default constructor call?
没有。它只是绕过了编译器检查。
"use of possibly unassigned field" 是保护您免受自己伤害的好方法。但它很容易解决。在这种情况下,它似乎并不那么重要。
PS: The memory seems to be zero-initialized anyway.
是的,在 .NET 中几乎总是如此(见下文),这使得 "default constructor call" 问题有点学术性。您的内存发生了什么与编译器警告没有那么紧密地耦合。
获取 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: 内存似乎是零初始化的。
Does taking address of a C# struct cause default constructor call?
没有。它只是绕过了编译器检查。
"use of possibly unassigned field" 是保护您免受自己伤害的好方法。但它很容易解决。在这种情况下,它似乎并不那么重要。
PS: The memory seems to be zero-initialized anyway.
是的,在 .NET 中几乎总是如此(见下文),这使得 "default constructor call" 问题有点学术性。您的内存发生了什么与编译器警告没有那么紧密地耦合。