如何防止在C#中初始化值类型的数组?

如何防止在C#中初始化值类型的数组?,c#,C#,默认情况下,.NET中任何类型的所有数组都初始化为0(对于引用类型,则初始化为null)。 有没有办法跳过此初始化?只是为了节省处理器时间。比如说,我确信稍后将使用不同的值再次初始化它: Random rnd = new Random(); Int32[] nums = new Int32[666]; Array.ForEach(nums, n => rnd.Next()); 为什么CLR应该将nums数组初始化为零?当它的长度为666*4字节时,表示ok。但是当

默认情况下,.NET中任何类型的所有数组都初始化为0(对于引用类型,则初始化为null)。 有没有办法跳过此初始化?只是为了节省处理器时间。比如说,我确信稍后将使用不同的值再次初始化它:

    Random rnd = new Random();
    Int32[] nums = new Int32[666];
    Array.ForEach(nums, n => rnd.Next());

为什么CLR应该将nums数组初始化为零?当它的长度为666*4字节时,表示ok。但是当它是10^6字节时?所以它不需要清除1M字节

如果C#在这方面与Java类似,那么清除是一个必要的特性。如果引用数组没有被清除,那么垃圾回收将把这些条目解释为有效的指针,并离开深层。如果C在这方面与Java类似,那么清除是一项必要的功能。如果引用数组未被清除,则垃圾回收会将条目解释为有效指针,并脱离深层。

它与数组无关。数组只需使用
default(T)
初始化每个元素。如果您有一个值类型,那么必须构造它。您不能以任何其他方式拥有值类型,否则会出现直接违反值类型语义目标的情况

我怀疑这是否真的是个问题。您是否分析了代码并确定这些阵列的初始化是一个瓶颈?我对此深表怀疑。即使在您的示例中,它也肯定不是瓶颈。专注于解决实际问题


如果你真的需要如此低级别的管理,那么你到底为什么要从C开始呢?

它与阵列无关。数组只需使用
default(T)
初始化每个元素。如果您有一个值类型,那么必须构造它。您不能以任何其他方式拥有值类型,否则会出现直接违反值类型语义目标的情况

我怀疑这是否真的是个问题。您是否分析了代码并确定这些阵列的初始化是一个瓶颈?我对此深表怀疑。即使在您的示例中,它也肯定不是瓶颈。专注于解决实际问题


如果你真的需要这样低级别的管理,那么你为什么要从C开始呢?

没有办法避免这一点,但是你可以通过创建自己的值类型(例如,可以从Random()初始化)来避免默认的Int32初始化。

没有办法避免这一点,但是您可以通过创建自己的值类型(例如,可以从Random()初始化)来避免默认的Int32初始化。

看起来您正在寻找动态分配。这不是数组可以做的事情,但是对于其他动态分配集合(比如列表)来说是可行的。
然而,这并不意味着它的性能更好。您只是将分配推迟到需要时

看起来您正在寻找动态分配。这不是数组可以做的事情,但是对于其他动态分配集合(比如列表)来说是可行的。
然而,这并不意味着它的性能更好。您只是将分配推迟到需要时

你的处理器时间快用完了吗?清除一百万字节并不需要很长时间,如果那些纳秒让你裹足不前,我建议C#不是适合你的应用程序的语言。仅供参考,至少在我的计算机上。。。。新的整数[10000000](10MB)需要50微秒不,只是想知道我能用C#编写多深的代码?也许大师们知道答案。我敢肯定,其中涉及ASM x86指令“rep stos”(b/w/d),而且速度很快,但没有必要。新的int[10MB]不是一个例子,可能有1Gb的数据,但是,同样-没有必要。无论如何,我可以在C++中分配MEM并使用它。@ OLEGSKRIPYAK:这不是C++。如果不需要内存,为什么还要分配内存?处理器时间是否已用完?清除一百万字节并不需要很长时间,如果那些纳秒让你裹足不前,我建议C#不是适合你的应用程序的语言。仅供参考,至少在我的计算机上。。。。新的整数[10000000](10MB)需要50微秒不,只是想知道我能用C#编写多深的代码?也许大师们知道答案。我敢肯定,其中涉及ASM x86指令“rep stos”(b/w/d),而且速度很快,但没有必要。新的int[10MB]不是一个例子,可能有1Gb的数据,但是,同样-没有必要。无论如何,我可以在C++中分配MEM并使用它。@ OLEGSKRIPYAK:这不是C++。如果不需要内存,为什么还要分配内存呢?列表使用一个数组作为存储,除非预先给它一个容量,否则它可能需要多次调整大小。我看不出使用列表在任何方面都会有更高的性能。数组比列表更高的性能是非常正确的,除此之外,我没有说过别的!这个问题暗示了对数组的错误假设,Oleg要求的是跳过分配!这在阵列中是不可能的,但是,您可以将分配推迟到需要时,动态集合可以为您提供一个以牺牲稀疏内存(性能!)为代价的解决方案。我明白您的意思,但我不认为它以任何方式解决了这个问题。他说他知道他将在某个数组中分配N个对象。我不认为如果他最终不需要所有的空间,他会担心浪费空间。我想我们不同意回答这个问题,但是(从你的回答)我们同意这个问题一开始可能是无效的。这并不意味着我在回答中提供了虚假或误导性的事实。它只是从另一个角度来处理这个问题。但是,我编辑了我的答案,以确保它没有被误解。列表使用一个数组作为存储,除非预先给它一个容量,否则它可能需要多次调整大小。我看不出使用列表有什么好处