2013-08-21 309 views
2

任何人都可以解释,为什么我必须使用这种代码模式?C#初始化数组

// 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(); } 

我不明白为什么当我打电话new CD[20]不会发生对象的数组初始化。看起来我正在编写多余的代码。其中一个步骤可以跳过吗?

+0

你可能想要考虑使用列表而不是数组:http://stackoverflow.com/questions/434761/array-versus-listt-when-to-use-这个 – User

回答

8

我不明白为什么数组中的对象的初始化不在运算符new中执行。

你的意思是这条线吗?

CD[] cdLibrary = new CD[20]; 

20个初始化对象。它初始化数组,只有数组 - 数组有20个元素,每个元素的值为null(空引用),以开头。这就像用给定数量的空白页面创建一本书一样;如果你想要页面包含信息,你必须分别写每个页面,这是后面的循环所做的。


我假设CD是类类型这里,为了简单起见。

+0

我可以猜出来。但是为了什么?为什么不简单?因为当我更正代码(我不知道它是在msdn中)时,我决定我犯了一些错误,像这样写代码。也许这是哲学的问题...... –

+3

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

+1

创建自己的方法来创建和初始化使用默认构造函数的对象的数组也是非常简单的,如果这是一个您经常执行的操作足以证明它的合理性。 – Servy

8
CD[] cdLibrary = new CD[20]; 

这只不过是创建'容器',您将在其中存储引用。考虑一下饼干罐,适合20个饼干。此时,您尚未创建一个cookie,您刚刚创建了一个jar(数组),该jar可以存放指定数量的cookie(本例中为CD对象)。

for (int i=0; i<20; i++) { 
cdLibrary[i] = new CD(); 
} 

这将创建20个饼干并将其放入jar中。

编辑:Jon Skeet在评论部分提到了一个很好的观点,一定要检查一下。他的比喻没有这个问题,应该被认为更准确(虽然饼干比纸更有趣)。

+2

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

+0

@JonSkeet:我完全看了看顺序。你的比喻确实比较合适,我在编辑中提到它。 –

+0

我被C++歪曲 - 也有新的init。它提供了什么参考?我有订单吗?我不这么认为。或者,如果它是垃圾收集的问题,但为什么初始化单出? –