2012-07-03 2 views
0

Возможно ли сохранить класс, содержащий список внутри массива?Сохранение списков внутри массива

У меня возникли проблемы с этой концепцией.

Вот мой код:

Мой класс под названием "arrayItems":

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace EngineTest 
{ 
    [Serializable] //List olarak save etmemiz için bu gerekli. 
    public class arrayItems 
    { 
     public List<items> items = new List<items>(); 
    } 
} 

Вот определение моего массива под названием "tileItems":

public static arrayItems[, ,] tileItems; 

Вот как я создаю мой массив :

Program.tileItems = new arrayItems[Program.newMapWidth, Program.newMapHeight, Program.newMapLayers]; 

Проблема, с которой я сталкиваюсь, заключается в том, что содержимое моего массива равно null. И я получаю эту ошибку:

Object reference not set to an instance of an object.

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

Можете ли вы направить меня в правильном направлении, пожалуйста? Спасибо заранее.

+0

Вы экземпляр массива 'titleItems', поэтому пространство для' arrayItems' ссылки были выделены, но, вы не установили ссылки на действительные экземпляры классов 'arrayItems'. – Jodrell

+0

Быстрое обходное решение состояло бы в том, чтобы изменить 'public class arrayItems' на' public struct arrayItems', тогда 'arrayItems' будет тогда типом значения, а не ссылочным типом. Однако это может иметь другие нежелательные побочные эффекты. – Jodrell

ответ

2

Поскольку вы уже инициализируете список в определении класса, вам не нужно повторно инициализировать свойство списка arrayItems в цикле.

У вас есть массив, содержащий кучу указателей, которые указывают на ничего. Таким образом, вам действительно нужно инициировать новый arrayItems в каждом элементе массива.

for (int i = 0; i < newMapWidth; i++) 
{ 
    for (int j = 0; j < newMapHeight; j++) 
    { 
     for (int k = 0; k < newMapLayers; k++) 
     { 
      arrayItems[i,j,k]= new arrayitem(); 
     } 
    } 
} 
+0

Спасибо, Джеймс, который решил это. – Theoden

6

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

for (int i = 0; i < newMapWidth; i++) 
{ 
    for (int j = 0; j < newMapHeight; j++) 
    { 
     for (int k = 0; k < newMapLayers; k++) 
     { 
      arrayItems[i,j,k] = new arrayItems(); 
     } 
    } 
} 

первым.

+0

Не должно быть arrayitems [i, j, k] = new arrayItems()? – JonC

+0

Вы хотите сказать: "Program.tileItems [x, y, z] .items = new Список ();" – Theoden

+0

@JonC: Да, исправлено! –

2

Вы создаете массив из arrayItems, который является ссылочным типом, потому что вы определили его как класс. Поэтому, когда вы инициализируете свой массив, все элементы будут назначены null по умолчанию. Вот почему вы получаете ошибку. Вы должны инициализировать каждый элемент вашего массива.

Смежные вопросы