是否可以在不初始化内部对象的情况下将数组初始化为容量?

时间:2018-09-03 07:43:37

标签: c# arrays

考虑一下,我知道我需要的数组的长度和类型,我可以这样做:

KnownType arrayName = new KnownType[knownSize];

但是此代码还将初始化内部对象,请考虑一种情况,在此情况下,我只是从另一个数组复制到此新数组中。我不需要初始化这些内部对象。我只需要可以存放所述对象的空白空间即可。

是否可以在不初始化内部对象的情况下创建具有特定容量的数组?

3 个答案:

答案 0 :(得分:3)

  

是否可以在不初始化内部对象的情况下创建具有特定容量的数组?

简而言之:不。您始终至少会保持默认值。

documentation在创建new数组时告诉我们:

  

新运算符用于创建数组并将数组元素初始化为其默认值

在这种情况下,引用类型将获得null

初始化默认值听起来很合理,因为内存已经分配并且不能用于其他任何用途。那么为什么不初始化值呢?

以下是文档中的示例:

int[] array = new int[5];
  

此数组包含从array [0]到array [4]的元素。 [...]在此示例中,所有数组元素均初始化为零。

编辑:区别参考值类型

  

考虑以下数组声明:

SomeType[] array4 = new SomeType[10];
  

此语句的结果取决于SomeType是值类型还是引用类型。如果是值类型,则该语句将创建一个包含10个元素的数组,每个元素的类型均为SomeType。如果SomeType是引用类型,则该语句创建一个由10个元素组成的数组,每个元素都初始化为一个空引用。

答案 1 :(得分:1)

考虑一下:

header("Content-Type: text/html; charset=UTF-8");

这将为10个项目创建空间,但不会创建这些项目。然后,您可以执行以下操作:

var myArray = new KnownType[10];

这将初始化对象。

答案 2 :(得分:-1)

@Mong Zhu的答案是问题的根源,但我认为值得指出的是,其他一些容器(例如List<T>)的构造函数会占用容量并允许预先分配,并且在参考类型,例如一个类,对象将不会初始化-容器只会分配空间并用null填充。

要使用的列表constructor

  

List<T>(Int32)初始化List类的新实例,该实例为空并具有指定的初始容量。