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

本文关键字:两次 数组 一个对象 实例化 为什么 | 更新日期: 2023-09-27 18:03:55

我创建了一个像这样的对象数组。但是要给对象赋值,我必须在数组的每个位置实例化每个对象?我为什么需要这个?

This is My method

 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; }
    }

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

我必须在数组的每个位置实例化每个对象?

没有实例化数组元素两次。在第一行中,您实例化了一个数组StageSplitDate,其中每个元素都设置为null。默认情况下,每个数组(引用类型)元素初始化为null。要进一步使用它,您还需要实例化数组中的每个对象,否则您将获得空引用异常。

为c#

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

数值数组元素的默认值设置为0,引用元素的默认值设置为null

(因为问题最初标记为java)

JAVA

4.12.5。变量初始值

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

您的数组是StageObject 引用的数组。StageObject本身还不存在。实际上,数组中的每一项只是"指向"或"引用"一个StageObject

在调用new StageObject()之前,每个数组元素都是null,这意味着它没有引用任何内容。

想象一个数组是书架的类比。如果你想要一书架的书,买书架只是第一步;然后你需要买每本书并把它放在书架上。这里的思路是一样的:分配数组给你一个空容器,然后你需要创建每个对象并将其放入容器中。

为什么会这样?因为初始值为空的数组通常是您想要的——即使不是这样,除非您的对象只有一个无参数构造函数,否则Java甚至不知道如何构造每个对象。

new StageObject[Stages.Rows.Count]创建一个新的StageObject引用数组,其中包含Stages.Rows.Count null引用。您希望每个元素都指向StageObject。为此,您需要创建一些StageObject实例。

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

上面的语句只对初始化为null的StageObject创建引用数组,而没有实际初始化StageObject的对象

StageSplitDate[i] = new StageObject();

上面的语句正在创建类型为StageObject的对象,并将引用赋值给StageSplitDate元素