C#初始化数组

Kir*_*kov 2 .net c# arrays initialization

任何人都可以解释一下,为什么我必须使用这种代码模式?

    // Create the array to store the CDs.
    CD[] cdLibrary = new CD[20];

    // Populate the CD library with CD objects.
    for (int i=0; i<20; i++)
    { cdLibrary[i] = new CD(); }
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么在调用时不会发生数组中对象的初始化new CD[20].好像我在编写多余的代码.可以跳过其中一个步骤吗?

Jer*_*vel 8

CD[] cdLibrary = new CD[20];
Run Code Online (Sandbox Code Playgroud)

这只会创建存储引用的"容器".考虑一下饼干罐,适合20个饼干.此时您还没有实际创建过cookie,您刚刚创建了一个jar(数组),它可以容纳指定数量的cookie(CD在这种情况下为对象).

for (int i=0; i<20; i++) {
 cdLibrary[i] = new CD(); 
}
Run Code Online (Sandbox Code Playgroud)

这将创建20个cookie并将其放入jar中.

编辑:Jon Skeet在评论部分提到了一个非常好的观点,请务必查看.他的比喻没有这个问题,应该被认为更准确(虽然饼干比纸张更有趣).

  • 我并不特别喜欢饼干罐类比,因为饼干罐子不是自然*有序* - 这就是为什么我给出了一个具有一定数量页面的书的类比.(它也适用于我经常在变量和纸张之间使用的类比,但这是一个稍微不同的事情.)并且区分对象和引用也很重要 - jar不包含CD*对象*,它持有参考. (2认同)

Jon*_*eet 8

我无法理解为什么数组中对象的初始化不会在operator new中执行.

你是说这条线吗?

CD[] cdLibrary = new CD[20];
Run Code Online (Sandbox Code Playgroud)

不会初始化20个对象.它初始化数组,只有数组 - 数组有20个元素,每个元素的值null(空引用)以1开头.这就像创建一个具有给定数量的空页的书; 如果您希望页面包含信息,则必须分别在每个页面上写入,这就是后面的循环所做的.


1CD为简单起见,我假设这是一种类型.

  • @ so-olitary:所以你建议语言应该*通过调用类`n`次的无参数构造函数来自动*填充数组?如果*是*没有无参数构造函数怎么办?或者如果我想以不同的方式实际填充它(例如,使用与之前相同的循环,但在每次迭代时将`i`作为参数传递给构造函数).根据我的经验,我*很少*想通过调用默认构造函数`n`次来填充数组,如果语言为我做了这个假设,我就讨厌它. (3认同)