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

考虑以下代码:


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"?

    }

}

在这种情况下,是否可以保证在MyStruct创建新的时Nums,每个索引处的值都会为 0?


在我自己的测试中,它似乎确实被初始化为默认值,但我问是因为它是unsafe.


阿晨1998
浏览 195回答 1
1回答

MYYA

啊,好吧,这花了一些时间才找到,但是从语言规范版本 3.0从18.7 固定大小缓冲区开始并继续有几个参考,最值得注意的是固定大小的缓冲区不受明确赋值检查(第 5.3 节)的约束,并且为了对 struct 类型变量进行明确赋值检查,将忽略固定大小的缓冲区成员。当固定大小缓冲区成员的最外层包含结构变量是静态变量、类实例的实例变量或数组元素时,固定大小缓冲区的元素会自动初始化为其默认值(第 5.2 节)。在所有其他情况下,固定大小缓冲区的初始内容是未定义的。现在,我自己还没有测试过,这些规范的语言有时很难完全理解。但是,这似乎与您的发现一致
打开App,查看更多内容
随时随地看视频慕课网APP