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

时间:2013-03-15 04:30:16

标签: c#

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

这是我的方法

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

5 个答案:

答案 0 :(得分:3)

  

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

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

对于C#

Arrays (C# Programming Guide) - MSDN

数值数组元素的默认值设置为零,引用元素设置为空

(因为该问题最初是为java标记的)

对于JAVA

4.12.5. Initial Values of Variables

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

答案 1 :(得分:2)

您的数组是StageObject 引用的数组。 StageObject本身尚不存在。基本上,数组中的每个条目仅“指向”或“引用”StageObject

在致电new StageObject()之前,每个数组元素都是null,这意味着它什么都没有。

答案 2 :(得分:2)

想想一个阵列是书架的类比。如果你想要一摞书,只需购买货架只是第一步;然后你需要购买每本书并把它放在架子上。同样的想法:分配数组为您提供一个空容器,然后您需要创建每个对象并将其放入容器中。

为什么会这样?因为最初为空的数组通常是你想要的 - 即使它不是,除非你的对象只有一个no-arg构造函数,Java甚至不知道如何构造每个对象。

答案 3 :(得分:1)

  

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

上面的语句只为StageObject生成了一个引用数组,这些引用数组初始化为null,但实际上并没有初始化StageObject的对象

  

StageSplitDate [i] = new StageObject();

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

答案 4 :(得分:1)

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