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

时间:2018-08-03 05:14:46

标签: 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"?
    }
}

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

在我自己的测试中,好像确实已将其初始化为默认值,但是我问,因为它是unsafe

1 个答案:

答案 0 :(得分:2)

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

但是从Language Specification Version 3.0

18.7固定大小的缓冲区开始,然后继续

有几个参考文献,最引人注目

  

固定大小的缓冲区不受明确的分配检查   (第5.3节),并且固定大小的缓冲区成员出于以下目的而被忽略   结构类型变量的确定赋值检查。当。。。的时候   固定大小的缓冲成员的最外面包含的struct变量是   静态变量,类实例的实例变量或   数组元素,固定大小缓冲区的元素会自动   初始化为其默认值(第5.2节)。 在所有其他情况下,   固定大小缓冲区的初始内容未定义。

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