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

Kev*_*vin 48 c#

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

GameObject[] houses = new GameObject[200];
Run Code Online (Sandbox Code Playgroud)

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

 houses[0].Model = Content.Load<Model>("Models\\Building_01 Windowed");
Run Code Online (Sandbox Code Playgroud)

这里houses[0]应该是一个GameObject和可以加载这样的,但是编译器会引发这个错误:

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

"在调用方法之前检查以确定对象是否为null"

我的初始化肯定有问题.

Dan*_*Tao 62

这里的问题是你已经初始化了你的数组,但没有初始化它的元素 ; 他们都是空的.因此,如果您尝试引用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;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以将你的houses数组初始化为:

GameObject[] houses = InitializeArray<GameObject>(200);
Run Code Online (Sandbox Code Playgroud)

  • @Robert:你并不总是想要初始化所有对象. (7认同)

Sta*_*ley 18

对于仍在寻找的人们

    Object[] obj = {
        new() { key = "key", value = "value"},
        new() { key = "key", value = "value"},
        new() { key = "key", value = "value"},
        new() { key = "key", value = "value"}
    };
Run Code Online (Sandbox Code Playgroud)

  • 你能把最后的逗号去掉吗?谢谢! (2认同)

Phi*_*ith 11

您正在创建一个空引用数组.你应该做的事情如下:

for (int i = 0; i < houses.Count; i++)
{
    houses[i] = new GameObject();
}
Run Code Online (Sandbox Code Playgroud)

  • 哎呀!我不使用数组 - 你为什么要这样?我使用某种收藏品.集合具有Count属性. (3认同)
  • 我很想听听这些情况。 (2认同)

Eug*_*ene 9

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

var houses = new GameObject[200].Select(h => new GameObject()).ToArray();
Run Code Online (Sandbox Code Playgroud)

实际上,您可以使用任何其他来源,甚至生成整数序列:

var houses = Enumerable.Repeat(0, 200).Select(h => new GameObject()).ToArray();
Run Code Online (Sandbox Code Playgroud)

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

  • 我实际上认为第二种情况更具可读性和显而易见性......就像你说的那样,在第一个例子中,原始序列的类型并不重要,这对于阅读它的人来说非常困惑.只是警告其他人使用它,但是如果编写性能关键代码,Enumerable.Repeat会产生一些性能影响.如果你不是那么我认为这是一个很好的解决方案. (2认同)