每当你在C#中分配一个新数组时
new T[length]
数组条目设置为默认值T. null
对于T
作为引用类型的情况或默认构造函数的结果T
,if T
是值类型.
在我的情况下,我想初始化一个Int32
值为-1 的数组:
var myArray = new int[100]; for (int i=0; i内存保留用于阵列操作后,在CLR循环通过新分配的内存,并设置所有条目为默认(INT)= 0.在那之后,我的代码将所有条目为-1.
这使初始化变得多余.是否JIT进行检测,并忽略了初始化为0,如果没有,有没有办法直接与自定义值初始化存储器的一部分?
参照C#数组初始化-与非默认值,使用
Enumerable.Repeat(value, length).ToArray()
没有选项,因为Enumerable.ToArray
以后分配一个新的数组,并复制的值到它.
1> Jon Skeet..:这不是多余的.
假设在初始化循环期间抛出异常.如果CLR尚未首先清除内存,您可能能够"看到"原始的未初始化内存,这是一个非常糟糕的主意,特别是从安全角度来看.这就是CLR保证将任何新分配的内存擦除为0位模式的原因.
顺便说一下,对象中的字段也适用相同的参数.
我在这两种情况下,假设CLR可以检查你不会使阵列可见别处结束初始化之前,但它是一个复杂的检查,以避免一个非常简单的"消灭这种存储区".
@Rauhotz可以随时抛出ThreadAbortException.
2> Taylor Leese..:与Dan的答案类似,但不需要使用集合:
int[] myArray = Enumerable.Repeat(-1, 100).ToArray();
3> Ðаn..:如果你购买被认为有些有害的阵列,那么你的问题就像你写的那样没有实际意义:
var myArray = new List(Enumerable.Repeat(-1, 100));
可能值得一提的是他的链接是Eric Lippert的博客,该案例表明Arrays是坏消息,因为在许多情况下,"调用者正在请求值.被调用者通过交回变量来完成请求." Lippert然后有趣地认为,由于物理限制使处理器更快,"我们将需要编程语言,允许凡人编写可并行化到多个核心[和那个]阵列的代码......强烈反对这一目标. " 如果与这个问题几乎不相关,这是一个很好的阅读.; ^)