C# - 为什么需要实例化每个数组元素?

时间:2009-02-24 20:59:58

标签: c# arrays

我经常使用这种类型的构造。

response = new LocationResponse ();
response.LocationDetails = new LocationDetail[4];
response.LocationDetails[0] = new LocationDetail();
response.LocationDetails[0].site = "ABCDE";
...

我不完全理解的是这件作品:

response.LocationDetails [0] = new LocationDetail();

为什么必须实例化数组的每个元素?

如果你遗漏了,你会得到未定义的例外。

8 个答案:

答案 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" }
    }
}