考虑一下,我知道我需要的数组的长度和类型,我可以这样做:
KnownType arrayName = new KnownType[knownSize];
但是此代码还将初始化内部对象,请考虑一种情况,在此情况下,我只是从另一个数组复制到此新数组中。我不需要初始化这些内部对象。我只需要可以存放所述对象的空白空间即可。
是否可以在不初始化内部对象的情况下创建具有特定容量的数组?
答案 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类的新实例,该实例为空并具有指定的初始容量。