Rau*_*otz 48 c# arrays initialization constants
每当你在C#中分配一个新数组时
new T[length]
Run Code Online (Sandbox Code Playgroud)
数组条目设置为默认值T. null
对于T
作为引用类型的情况或默认构造函数的结果T
,if T
是值类型.
在我的情况下,我想初始化一个Int32
值为-1 的数组:
var myArray = new int[100];
for (int i=0; i<myArray.Length; i++) { myArray[i] = -1; }
Run Code Online (Sandbox Code Playgroud)
内存保留用于阵列操作后,在CLR循环通过新分配的内存,并设置所有条目为默认(INT)= 0.在那之后,我的代码将所有条目为-1.
这使初始化变得多余.是否JIT进行检测,并忽略了初始化为0,如果没有,有没有办法直接与自定义值初始化存储器的一部分?
参照C#数组初始化-与非默认值,使用Enumerable.Repeat(value, length).ToArray()
没有选项,因为Enumerable.ToArray
以后分配一个新的数组,并复制的值到它.
Jon*_*eet 33
这不是多余的.
假设在初始化循环期间抛出异常.如果CLR尚未首先清除内存,您可能能够"看到"原始的未初始化内存,这是一个非常糟糕的主意,特别是从安全角度来看.这就是CLR保证将任何新分配的内存擦除为0位模式的原因.
顺便说一下,对象中的字段也适用相同的参数.
我在这两种情况下,假设CLR可以检查你不会使阵列可见别处结束初始化之前,但它是一个复杂的检查,以避免一个非常简单的"消灭这种存储区".
Tay*_*ese 32
与Dan的答案类似,但不需要使用集合:
int[] myArray = Enumerable.Repeat(-1, 100).ToArray();
Run Code Online (Sandbox Code Playgroud)
Ðаn*_*Ðаn 10
如果你购买被认为有些有害的阵列,那么你的问题就像你写的那样没有实际意义:
var myArray = new List<int>(Enumerable.Repeat(-1, 100));
Run Code Online (Sandbox Code Playgroud)