考虑以下代码:
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
。
答案 0 :(得分:2)
好吧,这花了一些时间才能找到,
但是从Language Specification Version 3.0
从 18.7固定大小的缓冲区开始,然后继续
有几个参考文献,最引人注目
固定大小的缓冲区不受明确的分配检查 (第5.3节),并且固定大小的缓冲区成员出于以下目的而被忽略 结构类型变量的确定赋值检查。当。。。的时候 固定大小的缓冲成员的最外面包含的struct变量是 静态变量,类实例的实例变量或 数组元素,固定大小缓冲区的元素会自动 初始化为其默认值(第5.2节)。 在所有其他情况下, 固定大小缓冲区的初始内容未定义。
现在,我还没有亲自测试过,有时很难完全理解这些规范的语言。但是,这似乎与您的发现一致