当前位置:  开发笔记 > 编程语言 > 正文

使用常量值进行直接数组初始化

如何解决《使用常量值进行直接数组初始化》经验,为你挑选了3个好方法。

每当你在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然后有趣地认为,由于物理限制使处理器更快,"我们将需要编程语言,允许凡人编写可并行化到多个核心[和那个]阵列的代码......强烈反对这一目标. " 如果与这个问题几乎不相关,这是一个很好的阅读.; ^)
推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有