如何在C#中声明一个对象数组

时间:2010-07-21 16:41:25

标签: c#

我有一个非常开始的C#问题。假设我有一个名为GameObject的类,我想创建一个GameObject个实体的数组。我可以考虑编写如下代码:

GameObject[] houses = new GameObject[200];

编译器抱怨(假设语法无效)。由于这是XNA开发,我在LoadContent()方法中加载我的纹理,如下所示:

 houses[0].Model = Content.Load<Model>("Models\\Building_01 Windowed");

其中houses[0]应该是GameObject并且可以像这样加载,但编译器会抛出此错误:

  

“使用”new“关键字创建对象实例”

     

“在调用方法之前检查以确定对象是否为空”

我的初始化肯定有问题。

7 个答案:

答案 0 :(得分:57)

这里的问题是您初始化了数组,但没有初始化元素;他们都是空的。因此,如果您尝试引用houses[0],则会null

这是你可以为自己写的一个很好的小助手方法:

T[] InitializeArray<T>(int length) where T : new()
{
    T[] array = new T[length];
    for (int i = 0; i < length; ++i)
    {
        array[i] = new T();
    }

    return array;
}

然后,您可以将houses数组初始化为:

GameObject[] houses = InitializeArray<GameObject>(200);

答案 1 :(得分:11)

您正在创建一个空引用数组。你应该做点什么:

for (int i = 0; i < houses.Count; i++)
{
    houses[i] = new GameObject();
}

答案 2 :(得分:8)

使用LINQ,您可以使用一行代码将未初始化元素数组转换为新创建对象集合。

var houses = new GameObject[200].Select(h => new GameObject()).ToArray();

实际上,你可以使用任何其他来源,甚至整数generated sequence

var houses = Enumerable.Repeat(0, 200).Select(h => new GameObject()).ToArray();

然而,第一种情况在我看来更具可读性,尽管原始序列的类型并不重要。

答案 3 :(得分:1)

我猜GameObject是参考类型。引用类型的默认值为null =&gt; 你有一个零数组。

您需要分别初始化阵列的每个成员。

houses[0] = new GameObject(..);

只有这样才能在没有编译错误的情况下访问该对象。

所以你可以明确地将数组初始化:

for (int i = 0; i < houses.Length; i++)
{
    houses[i] = new GameObject();
}

或者您可以将GameObject更改为值类型。

答案 4 :(得分:1)

您需要初始化数组的对象元素。

GameObject[] houses = new GameObject[200];

for (int i=0;`i<house` i<houses.length; i++)
{ houses[i] = new GameObject();}

当然,在引用元素之前,在其他任何地方使用不同的构造函数有选择地初始化元素。

答案 5 :(得分:0)

你拥有的一切看起来都很好。

我唯一能想到的(没有看到你应该提供的错误信息)就是GameObject需要一个默认的(无参数)构造函数。

答案 6 :(得分:0)

发生这种情况的原因是初始化数组不会初始化该数组中的每个元素。您需要先设置houses[0] = new GameObject(),然后才能生效。