当使用固定大小的数组创建不安全的结构时,数组是否初始化为默认值?

Min*_*neR 5 c# struct unsafe

考虑以下代码:

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.

AAA*_*ddd 5

啊好吧,这花了一些时间才找到,

\n\n

然而从语言规范3.0版来看

\n\n

从18.7 固定大小缓冲区开始并进一步

\n\n

有几个参考文献,最值得注意的是

\n\n
\n

固定大小缓冲区不受\n 明确赋值检查\n (\xc2\xa75.3) 的影响,并且出于结构类型变量\n 明确赋值检查的目的,固定大小缓冲区成员将被忽略。当固定大小缓冲区成员的最外层包含结构体变量是静态变量、类实例的实例变量或数组元素时,固定大小缓冲区的元素将自动初始化为其默认值值(\xc2\xa75.2)。在所有其他情况下,固定大小缓冲区的初始内容是未定义的。

\n
\n\n

现在,我自己还没有测试过,这些规范的语言有时很难完全理解。然而,这似乎与你的发现一致

\n