用一个常数值直接进行数组初始化
每当你用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的引用,结果将是可观察的。