Лекция 3.2
Ссылочные типы:
Массивы в C#. Оператор foreach.
Массивом называют упорядоченную совокупность элементов одного типа. Число индексов характеризует размерность массива. При объявлении массива границы задаются выражениями. Если все границы заданы константными выражениями, то число элементов массива известно в момент его объявления и ему может быть выделена память еще на этапе трансляции. Такие массивы называются статическими. Если же выражения, задающие границы, зависят от переменных, то такие массивы называются динамическими, поскольку память им может быть отведена только динамически в процессе выполнения программы, когда становятся известными значения соответствующих переменных.
Массивы в языке C# относятся к ссылочным типам, и память им отводится динамически в "куче". В языке C#, соблюдая преемственность, сохранены одномерные массивы и массивы массивов. В дополнение к ним в язык добавлены многомерные ступенчатые массивы.
Определение одномерных массивов:
int[] k; //k – одномерный массив
k=new int [3]; //Определяем массив из 3-х целых
k[0]=-5; k[1]=4; k[2]=55; //Задаем элементы массива
Элементы массива можно задавать сразу при объявлении:
int[] k = {-5, 4, 55};
public void TestDynAr() {
Console.WriteLine("Введите число элементов массива ");
int size = Int32.Parse(Console.ReadLine());
int[] A1 = new int[size];
}
Определение многомерных массивов:
int[,] k = new int [2,3];
Обратите внимение, что пара квадратных скобок только одна. Естественно, что в нашем примере у массива 6 (=2*3) элементов (k[0,0] - первый, k[1,2] - последний).
Аналогично мы можем задавать многомерные массивы. Вот пример трехмерного массива:
int[,,] k = new int [10,10,10];
А вот так можно сразу инициализировать многомерные массивы:
int[,] k = {{2,-2},{3,-22},{0,4}};
Приведенные выше примеры многомерных массивов называются прямоугольными. Если их представить в виде таблицы (в двумерном случае), то массив будет представлять из себя прямоугольник.
Определение ступенчатых массивов:
//Объявляем 2-мерный ступенчатый массив
int[][] k = new int [2][];
//Определяем 0-й элемент нашего ступенчатого массива в нем 3 элемента
k[0]=new int[3];
//Определяем 1-й элемент нашего ступенчатого массива в нем 4 элемента
k[1]=new int[4];
k[1][3]=22; //записываем 22 в последний элемент массива
Обратите внимание, что у ступенчатых массивов мы задаем несколько пар квадратных скобок (столько, сколько размерность у массива).
Таблица 1.2 – Создание ступенчатых массивов
Объявление и инициализация значениями | Объявление и инициализация нулевыми значениями | Объявление и инициализация нулевыми значениями |
int[][] jagger = new int[3][] { new int[] {5,7,9,11}, new int[] {2,8}, new int[] {6,12,4} }; | int[][] jagger1 = new int[3][] { new int[4], new int[2], new int[3] }; | int[][] jagger2 = { new int[4], new int[2], new int[3] }; |
Массив jagger имеет всего два уровня. Можно считать, что у него три элемента, каждый из которых является массивом. Для каждого такого массива необходимо вызвать конструктор new, чтобы создать внутренний массив. В первом случае элементы внутренних массивов получают значения, будучи явно инициализированы константными массивами. Во втором и третьем случае элементы внутренних массивов получают нулевые значения.
Еще одно важное замечание - динамические массивы возможны и здесь. В общем случае, границы на любом уровне могут быть выражениями, зависящими от переменных. Более того, допустимо, чтобы массивы на нижнем уровне были многомерными.