Есть свой класс (public class MyNum). Как объявить, а потом инициализировать двумерный динамический массив, с объектами моего класса?
Как ни пробую, ошибки. Как делаю:
public MyNum [][] Array1= new MyNum[2][];
Далее пытаюсь так:
Array1[0][0]=new MyNum(arg1);
Естественно получаю крит, потому что под элемент массива Array[0][0] не выделена память. Казалось бы Всё должно облегчить Array1[0].Append()
Но так тоже не работает.
Как использовать динамические массивы?
Доп вопрос В чем разница между объявлениями:
public MyNum[,] Array1;
public MyNum[][] Array1;
не понимаю и нигде об этом не написано. Как обычно!!!
На сколько я понимаю, под динамическим массивом имеется ввиду именно тот, который можно изменять по ходу работы программы. Добавлять элементы, удалять элементы. В шарпе таким "массивом" является List. (судя по вопросу, ты перешел с питона потому так неправильно и выражаюсь)
List является враппером (оберткой) вокруг Array. В джаве и некоторых других языках это называется ArrayList, что более соответствует тому, чем он является на самом деле. При желании ты можешь загуглить как именно он устроен.
Что именно тебе нужно - это создать лист листов.
var list = List<List<MyNum>>();
тогда же ты можешь использовать его так как тебе нужно.
list.add( new List<MyNum>() ); // добавляем строку
list[0].add( new MyNum(2) ); // добавляем ячейку в строку
и обращаться к нужной ячейке после этого
var myNum = list[0][0];
Использование же именно массивов для данного случая является нежелательным т.к. функция аппенд() по-факту является пересозданием массива в новой области памяти с размером на +1 ячейку с последующим копированием данных. Так что эта операция достаточно дорогостоящая по ресурсам и ее нужно избегать.
Конкретно массивы нужно использовать исключительно в том случае, если тебе наперед известно сколько именно элементов будет записано и их количество изменятся не будет.
Если же хочется использовать именно массив, то нужно сделать тот же подход что я сделал с листом. Сначала аппендить "строку под ячейки", а лишь потом уже аппендить ячейку в строку.
При выполнении данного кода
public MyNum [][] Array1= new MyNum[2][];
в Array1 будет два элемента null. Именно поэтому при попытке обратиться к Array1[0][0] происходит ошибка.
Для того чтобы это заработало, перед обращением к конкретному элементу нужно создать данный массив, например:
Array1[0] = new MyNum[2]();
Тогда строчка Array1[0][0]=new MyNum(arg1); уже не будет давать ошибку.
Также можно сразу инициализировать массив, например:
new MyNum[2][] { new[] { new MyNum() }, new[] { new MyNum() } };
Если количество заранее неизвестно, либо может изменяться в процессе выполнения, можно воспользоваться List<T>. В нем присутствует операция Add для добавления новых элементов.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости