Книга: C# для профессионалов. Том II
Одномерные массивы
Одномерные массивы
Для одномерных массивов (терминология C#: массивы ранга 1) синтаксис доступа в обоих языках идентичен — с квадратными скобками, используемыми для индикации элементов массива. Массивы начинаются с нулевого индекса в обоих языках.
Например, чтобы умножить каждый элемент массива float
на 2:
// массив, объявлен как массив float
// этот код работает в C++ и C# без каких-либо изменений
for (int i = 0; i < 10; i++) Array[i] = 2.0f;
Однако, как упоминалось ранее, массивы C# поддерживают свойство Length
, которое используется для определения числа элементов в массиве.
// массив, объявлен как массив float
// этот код компилируется только в C#
for (int i = 0; i < Array.Length; i++) Array[i] *= 2.0f;
В C# можно также использовать инструкцию foreach
для доступа к элементам массива, что рассматривалось ранее.
Синтаксис объявления массивов в C# слегка отличается, так как массивы C# всегда объявляются как ссылочные объекты.
double [] Array; // простое объявление ссылки без реального
// создания экземпляра массива
Array = new double[10]; // реально создается экземпляр объекта
// System.Array и задается размер 10.
Или, объединяя эти инструкции, запишем:
double [] array = new double[10];
Отметим, что размер массива задается только вместе с созданием его экземпляра. Объявление ссылки использует просто квадратные скобки для указания, что размерность (ранг) массива будет единица. В C# ранг считается частью типа массива, в отличие от числа элементов.
Ближайший эквивалент в C++ приведенного выше определения будет выглядеть так:
double *pArray = new double[10];
Эта инструкция C++ действительно дает достаточно близкую аналогию, так как обе версии C++ и C# размещаются в куче. Отметим, что версия C++ является просто областью памяти, которая содержит 10 double
, в то время как версия C# создает экземпляр полноценного объекта. Более простая стековая версия C++:
doublе pArray[10];
не имеет аналога в C#, который использует реальный массив C#, хотя инструкция C# stackalloc
может создать эквивалент этой инструкции с помощью указателей. Об этом мы будем говорить позже в разделе, в котором рассматривается ненадежный код.
Массивы в C# можно явно инициализировать при создании экземпляра:
double [] Array = new double[10] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 9.0, 10.0};
Существует также более короткая форма:
double [] Array = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 9.0, 10.0};
Если массив не инициализирован явно, то будет автоматически вызываться конструктор по умолчанию для каждого из его элементов. (Элементы массива формально рассматриваются как поля-члены класса.) Это поведение отличается от C++, где не допускается никакой автоматической инициализации массивов, размещенных с помощью оператора new
в куче (хотя C++ допускает это для массивов на основе стека).