Инициализация списка в структуре

1

В настоящее время у меня есть структура Match, которая содержит список блоков.

public struct Match{
    public List<Block> blocks;
}

Когда я пытаюсь создать новый Match (в этом случае, называемый matchData) и добавить Blocks в свой список Block, мои компиляторы выведут:

Use of unassigned local variable 'matchData'

Я попытался инициализировать список, выполнив следующие действия:

public struct Match{
    public List<Block> blocks = new List<Block>();
}

что приводит к следующей ошибке:

Structs cannot have instance field initializers

Итак, как мне инициализировать структуру Match? Должен ли я создавать конструктор?

  • 2
    Почему вы используете структуру вместо класса?
  • 0
    Я создал структуру по двум другим причинам: 1) Совпадения могут содержать другие данные, например, в каком направлении было выполнено сопоставление и какой блок является самым низким в сетке блоков. 2) Также будет список совпадений, так что это был бы хороший способ иметь список списков, которые отсортированы определенным образом. Нет причин, по которым я не мог бы использовать конструктор, наверное, я спросил это таким образом, чтобы убедиться, что я ничего не пропустил. Я еще не привык к структурам в C #, поскольку они кажутся отличными от других языков программирования, с которыми я более знаком.
Показать ещё 1 комментарий
Теги:
struct
initialization

2 ответа

5
Лучший ответ

Из MSDN:

Это также ошибка для инициализации поля экземпляра в теле структуры. Вы можете инициализировать члены структуры только с помощью параметризованного конструктора или путем доступа к членам отдельно после объявления структуры. Любые частные или другие недоступные члены могут быть инициализированы только в конструкторе.

http://msdn.microsoft.com/en-us/library/0taef578.aspx

Таким образом, вы можете инициализировать список в параметризованном конструкторе следующим образом:

public struct Match{
    public List<Block> blocks;

    public Match(List<Block> blocks)
    {
        this.blocks = blocks;
    }
}

Или установите его снаружи:

Match m = new Match();
m.blocks = new List<Block>();

В качестве побочной заметки вам, вероятно, было бы лучше использовать класс вместо структуры. Вы используете dosent, похоже, соответствуют типичному прецеденту, как указано здесь: http://msdn.microsoft.com/en-us/library/ah19swz4.aspx

4

Вы получали "Использование непризнанной локальной переменной matchData", потому что вы не вызывали new Match():

Match matchData;
matchData.blocks = new List<Block>();    // error!

Но:

Match matchData = new Match();
matchData.blocks = new List<Block>();    // fine!

Структуры имеют неявный конструктор без параметров, который инициализирует все поля значениями по умолчанию.

Тем не менее: вы должны использовать class вместо struct, если не понимать, как именно работают структуры в С#. Не просто используйте struct, потому что он "легче", чем класс.

В частности, ваша Block структура изменчива, что приводит к плохому времени.

  • 0
    +1 за рекомендацию класса

Ещё вопросы

Сообщество Overcoder
Наверх
Меню