开发者

How to declare an array of objects in C#

开发者 https://www.devze.com 2023-01-08 12:00 出处:网络
I have a very beginning C# question. Suppose I have a class called GameObject, and I want to create an array of GameObject entities. I could think of writing code like:

I have a very beginning C# question. Suppose I have a class called GameObject, and I want to create an array of GameObject entities. I could think of writing code like:

GameObject[] houses = new GameObject[200];

The compiler complains (assuming because of invalid syntax). Since this is XNA development, I load my texture in the LoadContent() method as follows:

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

where houses[0] should be a GameObject and can be loaded like this, but the compiler throws this error:

"Use the "new" keyword to create an object instance"

"Check to determine if the object is null before calling the method"

There must be something wrong with my ini开发者_如何学Gotialization.


The issue here is that you've initialized your array, but not its elements; they are all null. So if you try to reference houses[0], it will be null.

Here's a great little helper method you could write for yourself:

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;
}

Then you could initialize your houses array as:

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


With LINQ, you can transform the array of uninitialized elements into a new collection of created objects with one line of code:

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

Actually, you can use any other source for this, even generated sequence of integers:

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

However, the first solution seems more readable to me, although the type of the original sequence is not important.


You are creating an array of null references. You should do something like:

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


For people still looking

    Object[] obj = {
        new { key = "key", value = "value"},
        new { key = "key", value = "value"},
        new { key = "key", value = "value"},
        new { key = "key", value = "value"}
    };


I guess GameObject is a reference type. Default for reference types is null => you have an array of nulls.

You need to initialize each member of the array separatedly.

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

Only then can you access the object without compilation errors.

So you can explicitly initalize the array:

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

or you can change GameObject to value type.


The reason this is happening is because initializing an array does not initialize each element in that array. You need to first set houses[0] = new GameObject() and then it will work.


you need to initialize the object elements of the array.

GameObject[] houses = new GameObject[200];

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

Of course you initialize elements selectively using different constructors anywhere else before you reference them.


Everything you have looks fine.

The only thing I can think of (without seeing the error message, which you should have provided), is that GameObject needs a default (no parameter) constructor.

0

精彩评论

暂无评论...
验证码 换一张
取 消