Создайте массив структур в C # - PullRequest
1 голос
/ 02 июля 2010

У меня есть структура

struct myStruct {
    Dictionary<string, int> a;
    Dictionary<string, string> b;
    ......
}

Я хочу создать массив данных этой структуры

ArrayList l = new ArrayList();
myStruct s;

s.a.Add("id",1);
s.b.Add("name","Tim");

l.Add(s);

Однако я получил ошибку "Ссылка на объект не установлена ​​на экземпляр объекта."

Кто-нибудь может сказать мне, почему?

Спасибо.

Ответы [ 6 ]

6 голосов
/ 02 июля 2010

Поскольку ваше объявление словаря a не создает его, вы пытаетесь добавить элемент в нуль. Предполагается, что вы пометили их как общедоступные, иначе это не скомпилирует.

5 голосов
/ 02 июля 2010

Некоторые предложения по улучшению вашего кода:

  • Не используйте struct, вместо этого используйте class. Структуры в .NET немного отличаются , и если кто-то не понимает этих различий, я сомневаюсь, что кто-то когда-нибудь сможет использовать структуры. A class почти всегда то, что вы хотите.

  • ArrayList является более или менее устаревшим , почти всегда лучше вместо него использовать общий List<T>. Даже если вам нужно поместить смешанные объекты в список, List<object> - лучший выбор, чем ArrayList.

  • Убедитесь, что ваши члены правильно инициализированы, а не null, прежде чем вы получите доступ к их методам или свойствам.

  • Лучше использовать свойства вместо открытых полей.

Вот пример:

class Container
{
    Dictionary<string, int> A { get; set; }
    Dictionary<string, string> B { get; set; }

    public Container()
    {
         // initialize the dictionaries so they are not null
         // this can also be done at another place 
         // do it wherever it makes sense
         this.A = new Dictionary<string, int>();
         this.B = new Dictionary<string, string>();
    }
}

...
List<Container> l = new List<Container>();
Container c = new Container();
c.A.Add("id", 1);
c.B.Add("name", "Tim");

l.Add(c);
...
4 голосов
/ 02 июля 2010

Проблема в том, что ни a, ни b не инициируются. Установите каждый новый словарь.

Редактировать за комментарий:

Тогда ваша проблема в другом месте, так как отлично работает следующее:

struct myStruct
{
    public IDictionary<string, int> a;
    public IDictionary<string, string> b;
}

IList<myStruct> l = new List<myStruct>();
myStruct s;

s.a = new Dictionary<string, int>();
s.b = new Dictionary<string, string>();
s.a.Add("id", 1);
s.b.Add("name","Tim");

l.Add(s);
2 голосов
/ 02 июля 2010
 struct myStruct {
    private Dictionary<string, int> a;
    private Dictionary<string, string> b;

    public Dictionary<string, int> A
    {
        get { return a ?? (a = new Dictionary<string, int>()); }
    }

    public Dictionary<string, string> B
    {
        get { return b ?? (b = new Dictionary<string, string>()); }
    }
}

Это решит вашу проблему.Что вам нужно сделать, это получить доступ к словарям через свойства (геттеры).

1 голос
/ 02 июля 2010

Это может быть проблемой:

"Когда вы создаете объект структуры с помощью оператора new , он создается и вызывается соответствующий конструктор. В отличие от классов, структуры могут создаваться без использования оператора new. Если вы не используете new поля останутся неназначенными, и объект нельзя будет использовать, пока все поля не будут инициализированы. "

Возможно, либо вы не обновили свою структуру, либо некоторые из этих полей, скрытые за ..., еще не инициализированы?

http://msdn.microsoft.com/en-us/library/ah19swz4(VS.71).aspx

1 голос
/ 02 июля 2010

mystruct s инициализируется и не выдаст исключение нулевой ссылки.При инициализации он устанавливает для своих членов значения по умолчанию.Поэтому он устанавливает элементы a и b на null, поскольку они являются ссылочными типами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...