我有一个非常开始的C#问题。假设我有一个名为GameObject
的类,我想创建一个GameObject
个实体的数组。我可以考虑编写如下代码:
GameObject[] houses = new GameObject[200];
编译器抱怨(假设语法无效)。由于这是XNA开发,我在LoadContent()
方法中加载我的纹理,如下所示:
houses[0].Model = Content.Load<Model>("Models\\Building_01 Windowed");
其中houses[0]
应该是GameObject
并且可以像这样加载,但编译器会抛出此错误:
“使用”new“关键字创建对象实例”
“在调用方法之前检查以确定对象是否为空”
我的初始化肯定有问题。
答案 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()
,然后才能生效。