Подтвердить что ты не робот

Как объявить массив объектов в С#

У меня очень начальный вопрос С#. Предположим, что у меня есть класс под названием GameObject, и я хочу создать массив объектов GameObject. Я мог бы написать код, например:

GameObject[] houses = new GameObject[200];

Компилятор жалуется (предполагая из-за недействительного синтаксиса). Поскольку это XNA-разработка, я загружаю свою текстуру в метод LoadContent() следующим образом:

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

где houses[0] должен быть GameObject и может быть загружен как это, но компилятор выдает эту ошибку:

"Используйте ключевое слово" новое "для создания экземпляра объекта"

"Установите флажок, чтобы определить, является ли объект нулевым до вызова метода"

В моей инициализации должно быть что-то не так.

4b9b3361

Ответ 1

Проблема в том, что вы инициализировали свой массив, но не его элементы; все они равны нулю. Поэтому, если вы попытаетесь ссылаться на 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);

Ответ 2

Вы создаете массив нулевых ссылок. Вы должны сделать что-то вроде:

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

Ответ 3

С LINQ вы можете преобразовать массив неинициализированных элементов в новую коллекцию созданных объектов с одной строкой кода.

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

На самом деле вы можете использовать любой другой источник для этого, даже сгенерированную последовательность целых чисел:

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

Однако первый случай кажется мне более читаемым, хотя тип исходной последовательности не важен.

Ответ 4

Я думаю, GameObject является ссылочным типом. Значение по умолчанию для ссылочных типов: null = > у вас есть массив нулей.

Вам нужно инициализировать каждый элемент массива отдельно.

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

Только тогда вы можете получить доступ к объекту без ошибок компиляции.

Итак, вы можете явно инициализировать массив:

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

или вы можете изменить GameObject на тип значения.

Ответ 5

Все, что у вас хорошо выглядит.

Единственное, о чем я могу думать (не видя сообщение об ошибке, которое вы должны были предоставить), заключается в том, что GameObject нуждается в конструкторе по умолчанию (без параметров).

Ответ 6

Причина, по которой это происходит, заключается в том, что инициализация массива не инициализирует каждый элемент в этом массиве. Вам нужно сначала установить houses[0] = new GameObject(), а затем он будет работать.