获取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;
}
Run Code Online (Sandbox Code Playgroud)
然后,当然,我不能这样做:
S s; // no constructor call, so...
var v = s.Value; // compiler error: use of possibly unassigned field 'Value'
Run Code Online (Sandbox Code Playgroud)
但是一旦我获得了结构的指针,我甚至可以在不使用指针的情况下读取它的字段,甚至是嵌入式结构域的字段:
S s;
S* ps = &s;
var v1 = ps->Value; // OK, expected
var v2 = s.Value; // OK!
var len = s.Header.LENGTH; // OK!
Run Code Online (Sandbox Code Playgroud)
那么,它是否以某种方式调用默认构造函数,或者 - 一旦我获取地址 - C#停止关注内存?
PS:无论如何,内存似乎都是零初始化的.
Hen*_*man 10
获取C#结构的地址是否会导致默认的构造函数调用?
不,它只是绕过编译器检查.
"使用可能未分配的字段"是一种保护您免受自身攻击的精确之处.但它很容易解决.在这种情况下,它似乎并不那么重要.
PS:无论如何,内存似乎都是零初始化的.
是的,这几乎总是(见下文)是.NET中的情况,使"默认构造函数调用"问题有点学术性.你的记忆发生了什么并没有与编译器警告紧密耦合.