我经常使用这种类型的构造。
response = new LocationResponse ();
response.LocationDetails = new LocationDetail[4];
response.LocationDetails[0] = new LocationDetail();
response.LocationDetails[0].site = "ABCDE";
...
我不完全理解的是这件作品:
response.LocationDetails [0] = new LocationDetail();
为什么必须实例化数组的每个元素?
如果你遗漏了,你会得到未定义的例外。
答案 0 :(得分:13)
如果数组元素被自动实例化,那么您将被锁定到您定义数组的类中。您将无法使用抽象类或接口的数组或任何没有默认构造函数的对象。这只是在自动实例化数组中的对象时命名一些问题。
答案 1 :(得分:4)
如果它是值类型(struct),则无需实例化LocationDetail。如果它是一个类,则必须实例化它,因为引用类型的默认值为null。
此代码有效:
public struct LocationDetail
{
private string site;
public string Site
{
get { return site; }
set { site = value; }
}
}
static void Main(string[] args)
{
LocationResponse response = new LocationResponse();
response.LocationDetails = new LocationDetail[4];
response.LocationDetails[0].Site = "ABCDE";
Console.Write(response.LocationDetails[0].Site);
}
答案 2 :(得分:2)
将其视为引用指针,如果未初始化,则每个LocationDetail项都有一个空值。
答案 3 :(得分:2)
它将每个元素设置为null,这是一个类的默认值,除非你另有说法。
C#如何自动为您实例化元素?也许你的数组中的那个类型甚至没有默认的构造函数。也许你不想在实际拥有它们之前消耗整个元素数组所需的内存。
我没有看到让运行时提前尝试填充该数组的优势。
答案 4 :(得分:2)
我认为数组是鸡蛋盒。您可以申报一个鸡蛋盒,但不会将鸡蛋放入您的纸箱中 - 您仍需要确定将哪种鸡蛋放入纸箱的每个槽中。你可能想要一些复活节彩蛋,但其他人则需要AA级自由漫游的棕色蛋。
阵列本身无法提前知道你想要什么,所以它默认不会在你的插槽中放任何东西。
答案 5 :(得分:1)
这将是一项代价高昂的操作,具体取决于创建对象需要执行的操作。如果不能简单地实例化对象怎么办?或者,如果您需要一个给定类型的数组,其中只有一些字段最终将包含一个对象而其他字段应该为null?
答案 6 :(得分:1)
正如其他人所指出的,声明后数组将充满null
秒。您可以通过以下方式简化初始化逻辑:
response.LocationDetails = new LocationDetails [] {
new LocationDetails(),
new LocationDetails(),
new LocationDetails(),
new LocationDetails()
};
如果LocationDetails构造函数有一个带有siteid的重载,那么更好的是:
response.LocationDetails = new LocationDetails [] {
new LocationDetails("ABCDE"),
new LocationDetails("FGHIJ"),
new LocationDetails("KLMNO"),
new LocationDetails("PQRST")
};
或者大法官指出的超级奇特的C#3.0东西:)
答案 7 :(得分:1)
response = new LocationResponse() {
LocationDetails = new LocationDetail[] {
new LocationDetail { site = "ABCDE" }
}
}