Список как свойство в классе [дубликата]

Предполагая, что нет виртуального / множественного наследования (что усложняет ситуацию совсем немного), тогда правила просты:

  1. Память объекта выделена
  2. Конструктор базовые классы выполняются, заканчивающиеся на большинство полученных
  3. Выполняется инициализация члена
  4. Объект становится истинным экземпляром его класса
  5. Выполняется код конструктора
  6. g4]

Важно помнить, что до шага 4 объект еще не является экземпляром его класса, потому что он получает этот заголовок только после запуска конструктора. Это означает, что если есть исключение, созданное во время конструктора элемента, деструктор объекта не выполняется, а только уже созданные части (например, члены или базовые классы) будут уничтожены. Это также означает, что если в конструкторе члена или базового класса вы вызываете любую виртуальную функцию-член объекта, то названная реализация будет базовой, а не производной. Еще одна важная вещь, которую следует помнить, это то, что член, указанный в списке инициализации, будет построен в том порядке, в котором они объявлены в классе, НЕ в том порядке, в котором они появляются в списке инициализации (к счастью, большинство достойных компиляторов выдадут предупреждение, если вы перечислите членов в другом порядке от объявления класса).

Обратите также внимание, что даже если во время выполнения кода конструктора объект this уже получил свой последний класс (например, в отношении виртуальной диспетчеризации), деструктор класс НЕ будет вызываться, если конструктор не завершит свое выполнение. Только когда конструктор завершает выполнение, экземпляр объекта является реальным гражданином первого класса среди экземпляров ... до этого момента это только «желаемый экземпляр» (несмотря на наличие правильного класса).

Уничтожение происходит в точный обратный порядок: сначала выполняется деструктор объекта, затем он теряет свой класс (т. е. с этой точки на объекте считается базовым объектом), тогда все члены уничтожаются в обратном порядке объявления и, наконец, процесс уничтожения базового класса выполняется до самого абстрактного родителя. Что касается конструктора, если вы вызываете какую-либо виртуальную функцию-член объекта (прямо или косвенно) в деструкторе базы или члена, исполняемая реализация будет родительской, потому что объект потерял заголовок класса при завершении деструктора класса.

-2
задан Xami Yen 16 January 2019 в 21:52
поделиться

4 ответа

Вы не инициализируете свойство, поэтому оно является нулевым.

Попробуйте это:

public class Orders
{
    public List<Items> ItemList { get; set; } = new List<Items>();
}
0
ответ дан Neil B 16 January 2019 в 21:52
поделиться

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

public class Orders
{
    public Orders()
    {
        ItemList = new List<Items>();
    }

    public List<Items> ItemList { get; private set; }
}
0
ответ дан Grant 16 January 2019 в 21:52
поделиться

Вы забыли инициализировать ItemsList, поэтому вы получаете исключение нулевого указателя

public class Orders
{
    public List<Items> ItemList { get; set; } = new List<Items>();
}
0
ответ дан Bruno Caceiro 16 January 2019 в 21:52
поделиться

Список не был инициализирован с новым экземпляром списка.

orders.ItemList = new List<Items>();

Код будет выглядеть так:

Orders orders = new Orders();
orders.ItemList = new List<Items>();
for (int i = 1; i < 10; i++)
{
    Items itm = new Items
    {
        ItemName = $"Item {i}"
    };
    orders.ItemList.Add(itm);
}
0
ответ дан user1579234 16 January 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: