【问题标题】:C# initialization arrayC# 初始化数组
【发布时间】:2013-08-21 16:21:19
【问题描述】:

谁能解释一下,为什么我必须使用这个 Code Pattern?

    // 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] 时不会发生数组中对象的初始化。好像我在写多余的代码。可以跳过这些步骤之一吗?

【问题讨论】:

标签: c# .net arrays initialization


【解决方案1】:

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

你是说这条线吗?

CD[] cdLibrary = new CD[20];

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


1 为简单起见,我假设CD 在这里是一个类类型。

【讨论】:

  • 我猜到了。但是为了什么?为什么不简单呢?因为,当我更正代码时(我不知道它在 msdn 中),我决定我做错了什么,编写这样的代码。也许是哲学问题……
  • @so-olitary:所以您是在建议语言应该自动通过调用类n 的无参数构造函数来填充数组?如果 is 没有无参数构造函数怎么办?或者,如果我想以不同的方式实际填充它怎么办(例如,使用与以前相同的循环,但在每次迭代时将 i 作为参数传递给构造函数)。根据我的经验,我很少只想通过调用默认构造函数 n 次来填充一个数组,如果语言为我做出这样的假设,我会讨厌它。
  • 创建自己的方法来使用默认构造函数创建和初始化包含对象的数组也很简单,如果这是您碰巧经常执行的操作以证明它是合理的。
【解决方案2】:
CD[] cdLibrary = new CD[20];

这只不过是创建一个“容器”来存储引用。把它当作饼干罐,适合 20 个饼干。此时您实际上还没有创建 cookie,您只是创建了一个 jar(数组),它可以容纳指定数量的 cookie(在本例中为CD 对象)。

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

这将创建 20 个 cookie 并将其放入罐中。

编辑:Jon Skeet 在评论部分提到了一个非常好的观点,请务必查看。他的类比没有这个问题,应该被认为更准确(尽管 cookie 比纸更有趣)。

【讨论】:

  • 我不是特别喜欢 cookie jar 的类比,因为 cookie jar 不是自然有序 - 这就是为什么我用一定数量的书类比页数。 (它也适用于我经常在变量和一张纸之间使用的类比,但这是一个稍微不同的问题。)区分对象和引用也很重要 - jar 不包含 CD objects,它包含引用。
  • @JonSkeet:我完全忽略了排序。那你的比喻确实更合适,我在编辑中提到过。
  • 我被 C++ 扭曲了——也有新的 init。它保留参考是为了什么?我得到有序列表吗?我不这么认为。或者如果是垃圾回收的问题,为什么初始化单独出来?
  • 您没有得到一个有序列表(这意味着有一些标准可以订购),而是该列表维护了已输入的订单元素。 cookie jar 无法保存订单(此处适合使用 bag 集合)。 cookie jar 中没有对象,只有对您创建的对象的引用。已经写了很多关于这方面的文章,比我写的要好。
猜你喜欢
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 2018-01-15
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多