代码之家  ›  专栏  ›  技术社区  ›  MineR

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

  •  1
  • MineR  · 技术社区  · 6 年前

    请考虑以下代码:

    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 回复  |  直到 6 年前
        1
  •  2
  •   TheGeneral    6 年前

    啊,好吧,这需要一些时间才能找到,

    但是来自 Language Specification Version 3.0

    开始于 18.7固定尺寸缓冲器 并继续

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

    固定大小的缓冲区不受明确分配检查的约束 (§5.3),为了 结构类型变量的确定赋值检查。当 固定大小缓冲区成员的最外层包含结构变量是 静态变量、类实例的实例变量或 数组元素,固定大小缓冲区的元素将自动 初始化为它们的默认值(5.2)。 在所有其他情况下 固定大小缓冲区的初始内容未定义。

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