考虑以下代码:
public unsafe struct MyStruct
{
public fixed int Nums[128];
}
private static void DoSomething()
{
MyStruct s = new MyStruct();
unsafe
{
int val = s.Nums[23];
Console.WriteLine(val.ToString()); //Is this guaranteed to be "0"?
}
}
Run Code Online (Sandbox Code Playgroud)
这样的话,是不是保证新建一个的时候MyStruct,at每个索引的值都Nums为0呢?
在我自己的测试中,它似乎确实被初始化为默认值,但我问是因为它是unsafe.
啊好吧,这花了一些时间才找到,
\n\n然而从语言规范3.0版来看
\n\n从18.7 固定大小缓冲区开始并进一步
\n\n有几个参考文献,最值得注意的是
\n\n\n\n\n固定大小缓冲区不受\n 明确赋值检查\n (\xc2\xa75.3) 的影响,并且出于结构类型变量\n 明确赋值检查的目的,固定大小缓冲区成员将被忽略。当固定大小缓冲区成员的最外层包含结构体变量是静态变量、类实例的实例变量或数组元素时,固定大小缓冲区的元素将自动初始化为其默认值值(\xc2\xa75.2)。在所有其他情况下,固定大小缓冲区的初始内容是未定义的。
\n
现在,我自己还没有测试过,这些规范的语言有时很难完全理解。然而,这似乎与你的发现一致
\n