为什么我们必须为Array中的每个元素调用构造函数?

时间:2009-07-06 08:38:47

标签: c# arrays

这似乎是一个基本问题,但它仍然困扰着我。

为什么不

MyObject [] myobject = new MyObject [10];

分配10个对象?为什么我们必须在每个单独的对象上调用new

myobject [0] = new MyObject();
:::
myobject [9] = new MyObject();

或者我只是犯了一个愚蠢的错误? :)

7 个答案:

答案 0 :(得分:7)

据我所知,你不是在数组中创建10个对象,你创建的数组有10个空格用于“我的对象”类型的对象,但是对于数组中的项目,null是完全可接受的状态。

答案 1 :(得分:2)

您正在调用数组构造函数,它会创建一个数组,而不是对象构造函数十次。

您想要调用元素类型的构造函数吗?没有办法提供任何参数。隐式调用的唯一构造函数是值类型(结构),如整数和双精度。

如果元素构造函数失败怎么办?它可以抛出任何异常。你应该得到半个初始化数组,还是根本没有数组?异常泡沫或隐藏吗?

如果元素构造函数非常慢,该怎么办?添加一个Thread.Sleep(),调用你的代码基本上会挂起。你会如何调试?

我最后的想法,为什么你在使用List< T>?时甚至使用数组? =)

答案 2 :(得分:1)

您还可以使用以下声明样式(在以下示例中不是特别有用,我建议使用for循环)

MyObject [] myObject = new MyObject [] {new MyObject(),new MyObject(),new MyObject(),new MyObject(),new MyObject(),new MyObject(),new MyObject(),new MyObject (),new MyObject(),new MyObject()};

然而,在这种情况下,输入可能更容易。

int [] myInts = new int [] {10,34,13,43,55,2,0,23,6,23};

答案 3 :(得分:0)

这是因为它只将引用分配给MyObject,而不是对象本身。在C#或Java等语言中,每种非原始类型都是这种情况。

答案 4 :(得分:0)

这正是它应该如何完成的。

例如:

MyObject[] myObject = new MyObject[10]; // creates 10 null references

for (int i=0;i<myobject.Length;i++)
   myobject[i] = new MyObject();

答案 5 :(得分:0)

因为你创建的所有内容都是一个包含10个空格的数组,它将包含你的MyObject对象实例。你什么时候把它们放进去和处于什么状态,这取决于你。

答案 6 :(得分:0)

看起来你在语法上谈论C#。

或多或少,在CLR / .NET框架中,数组是一个包含MyObject类型对象的数组。与C / C ++不同,其中数组是MyObject类型的对象数组。

即。 C#数组只是容器,概念上它们与它们所拥有的对象不同。 C / C ++(本机内存),你几乎作弊并放弃了明确职责的形式......你的数组本质上就是它所包含的对象....