为什么我需要两次实例化对象数组?

6
我已经创建了一个对象数组。但是要给对象赋值,我需要在数组的每个位置实例化每个对象吗?为什么我需要这样做?
这是我的方法。
 StageObject[] StageSplitDate = new StageObject[Stages.Rows.Count];
            for (int i = 0; i < Stages.Rows.Count; i++)
            {
                StageSplitDate[i] = new StageObject();
                StageSplitDate[i].StageId = "String Value";
                StageSplitDate[i].FromTime = StartTime;
                StartTime =StartTime.AddMinutes(Convert.ToDouble(10));
                StageSplitDate[i].ToTime = StartTime;
            }
            return StageSplitDate;

对象类

 public class StageObject
    {
        public string StageId { get; set; }
        public DateTime FromTime { get; set; }
        public DateTime ToTime { get; set; }
    }

第一步,定义数组,分配足够的内存来容纳元素。下一步,将实际值分配给数组中的位置。在为数组中的某个位置分配值之前,它没有任何值,是空的。 - MadProgrammer
只是出于好奇,为什么在这里标记了 **C#**?(O_o) - Rahul
3
@R.J,更确切地说为什么是Java,除非它现在有一个Convert.ToDouble方法。 - Anthony Pegram
更重要的是,它不会(或者不应该)为数组元素分配内存。它们应该只是空指针,直到每个元素使用“new”分配内存。 - Ryan Amos
@RyanAmos 对,使用“分配内存”的过程是可以被中断的,但它确实需要为指针分配“空间”进行存储。它并没有为对象分配内存,这是后来的事情。 - MadProgrammer
C#被标记了,因为它是用C#编写的,并且标记了Java,因为两个代码似乎是相同的。 - Subin Jacob
5个回答

3
我必须在数组的每个位置实例化每个对象吗?
您没有两次实例化数组元素。在第一行中,您使用每个元素均为null的数组StageSplitDate进行了实例化。 默认情况下,每个数组(引用类型)元素都初始化为null。要进一步使用它,您需要实例化数组中的每个对象,否则将会收到空引用异常。 对于C#

数组(C#编程指南)- MSDN

数值数组元素的默认值设置为零,而参考元素设置为null

(由于问题最初标记为Java)

对于JAVA

4.12.5。 变量的初始值

  • 创建类变量,实例变量或数组组件时,每个都会初始化为默认值(§15.9,§15.10):
  • 对于所有引用类型(§4.3),默认值为null

但是在创建数组时,数组中的所有对象都已定义。数组不能具有不同的数据类型。那么为什么我们要为每个对象初始化它呢?难道不是在声明数组本身时就已经定义好了吗? - Subin Jacob
@SubinJacob,这就是语言设计者选择的方式,现在想象一下如果需要用一些默认值实例化一个对象(例如-缺少默认构造函数,而是构造函数需要一些参数),那么你会怎么做呢? - Habib

2
你的数组是一个StageObject引用数组。 StageObject本身还不存在。实际上,数组中的每个条目仅“指向”或“引用”一个StageObject
在调用new StageObject()之前,每个数组元素都是null,这意味着它没有引用任何东西。

2
想象一下,数组就像书架。如果你想要一个书架上的书,仅购买书架只是第一步;接下来,你需要购买每本书并将其放在书架上。同样的道理,在此处:分配数组会给你一个空容器,然后你需要创建每个对象并将其放入容器中。
为什么会这样呢?因为初始为空的数组通常是你想要的 - 即使不是这样,除非你的对象只有一个无参构造函数,否则Java甚至不知道如何构造每个对象。

但是在创建数组时,数组中的所有对象都已定义。数组不能具有不同的数据类型。那么为什么我们要为每个对象初始化它呢?难道不是在声明数组本身时就已经定义好了吗? - Subin Jacob
不,定义的是一堆数组引用的插槽。你需要自己给这些插槽赋值。 - yshavit

1

StageObject[] StageSplitDate = new StageObject[Stages.Rows.Count];

上述语句仅为 StageObject 数组创建引用,但未实际初始化 StageObject 对象。

StageSplitDate[i] = new StageObject();

上述语句创建了类型为 StageObject 的对象,并将引用分配给 StageSplitDate 元素。


1

new StageObject[Stages.Rows.Count] 创建一个新的 StageObject 引用数组,包含 Stages.Rows.Count 个空引用。你需要让每个元素指向一个 StageObject。为了做到这一点,你需要创建一些 StageObject 实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接