用一个常数值直接进行数组初始化

每当你用C#分配一个新的数组

new T[length] 

数组条目设置为T的默认null对于T是引用types或T的默认构造函数的结果,如果T是值types,则为null

在我的情况下,我想初始化一个Int32数组的值为-1:

 var myArray = new int[100]; for (int i=0; i<myArray.Length; i++) { myArray[i] = -1; } 

所以在为数组保留内存之后,CLR将循环遍历新分配的内存,并将所有条目设置为default(int)= 0。之后,我的代码将所有条目设置为-1。

这使得初始化变得冗余。 JIT是否检测到这一点,并忽略初始化为0,如果不是,有没有办法直接用自定义值初始化一部分内存?

引用C#数组初始化 – 使用非默认值 ,使用Enumerable.Repeat(value, length).ToArray()是没有select的,因为Enumerable.ToArray分配一个新的数组,然后将值复制到它。

这不是多余的。

假设在你的初始化循环中抛出一个exception。 如果CLR没有先清除内存,那么可能会“看到”原始未初始化的内存,这是一个非常糟糕的主意,特别是从安全angular度来看。 这就是为什么CLR保证将新分配的内存擦除为0位模式。

顺便说一下,对于对象中的字段也是如此。

我想在这两种情况下,CLR都可以检查在完成初始化之前,你不打算让数组在其他地方可见,但是要避免一个非常简单的“擦除这个区域的内存”是一个复杂的检查。

类似丹的答案,但不需要使用集合:

 int[] myArray = Enumerable.Repeat(-1, 100).ToArray(); 

如果你买进被认为有害的arrays ,那么你的问题就会像你所写的那样是毫无意义的:

 var myArray = new List<int>(Enumerable.Repeat(-1, 100)); 

我非常怀疑JIT会优化这个场景的默认设置。 原因是这是一个可观察到的差异。 考虑下面稍微改变的情况。

 obj.myArray = new int[100]; for (int i=0; i<myArray.Length; i++) { obj.myArray[i] = -1; } 

循环完全可能抛出。 至less,JIT可能无法certificate它没有。 如果抛出并且CLR没有默认初始化内存,那么如果你仍然有一个对obj的引用,结果将是可观察的。