Формально говоря, массив - это коллекция указателей на данные одного и того же вполне определенного типа, доступ к которым осуществляется по числовому индексу. Массивы являются ссылочными типами и получаются из общего базового класса System.Array. По умолчанию для .NET-мaccивов начальный индекс равен нулю, но с помощью статического метода System.Array.CreateInstance() для любого массива можно задать любую нижнюю границу для его индексов.
Массивы в C# можно объявлять по-разному. Во-первых, если вы хотите создать массив, значения которого будут определены позже (возможно после ввода соответствующих данных пользователем), то, используя квадратные скобки ([]), укажите размеры массива во время его создания. Например:
// Создание массива строк, содержащего 3 элемента (0-2)
string[] booksOnCOM;
booksOnCOM = new string[3];
// Инициализация 100-элементного массива с нумерацией (0- 99)
string[] booksOnDotNet = new string[100];
Объявив массив, вы можете использовать синтаксис индексатора, чтобы присвоить значения его элементам.
// Создание, заполнение и печать массива из трех строк.
string[] booksOnCOM; booksOnCOM = new string[3];
booksOnCOM[0] = "Developer's Workshop to COM and ATL 3.0";
booksOnCOM[1] = "Inside COM";
booksOnCOM[2] = "Inside ATL";
foreach (string s in booksOnCOM) Console.WriteLine(s);
Если значения массива во время его объявления известны, вы можете использовать "сокращенный" вариант объявления массива, просто указав эти значения в фигурных скобках. Указывать размер массива в этом случае не обязательно (он вычисляется динамически), как и при использовании ключевого слова new. Так, следующие варианты объявления массива эквивалентны.
// 'Краткий' вариант объявления массива
// (значения во время объявления должны быть известны).
int[] n = new int[] {20, 22, 23, 0};
int[] n3 = {20, 22, 23, 0};
И наконец, еще один вариант создания типа массива.
int[] n2 = new int[4] {20, 22, 23, 0}; // 4 элемента, {0- 3}
В данном случае указанное числовое значение задает число элементов в массиве, а не граничное сверху значение для индексов. При несоответствии между объявленным размером и числом инициализируемых элементов вы получите сообщение об ошибке компиляции.
Независимо от того, как вы объявите массив, элементам в .NET-массиве автоматически будут присвоены значения, предусмотренные по умолчанию, сохраняющиеся до тех пор, пока вы укажете иные значения. Так, в случае массива числовых типов, каждому его элементу присваивается значение 0 (или 0.0 в случае чисел с плавающим разделителем), объектам присваивается null (пустое значение), а типам Boolean – значение false (ложь).
Массивы в качестве параметров (и возвращаемых значений)
После создания массива вы можете передавать его, как параметр, или получать его в виде возвращаемого значения. Например, следующий метод PrintArray() получает входной массив строк и выводит каждый элемент на консоль, а метод GetStringArray() "наполняет" массив значениями и возвращает его вызывающей стороне.
static void PrintArray (int[] myInts){
for (int i = 0; i ‹ myInts.Length; i++) Console.WriteLine("Элемент {0} равен {1}", i, myInts[i]);
}
static string[]GetStringArray() {
string theStrings = { "Привет", "от", "GetStringArray"};
return theStrings;
}
Эти методы можно вызвать из метода Main(), как показано ниже.
static void Main(string[] args) {
int[] ages={20, 22, 23, 0};
PrintArray(ages);
string[] strs = GetStringArray();
foreach(string s in strs) Console.WriteLine(s);
Console.ReadLine();
}
Работа с многомерными массивами
Вдобавок к одномерным массивам, которые мы рассматривали до сих пор, в C# поддерживаются два варианта многомерных массивов. Первый из них – это прямоугольный массив, т.е. многомерный массив, в котором каждая строка оказывается одной и той же длины. Чтобы объявить и заполнить многомерный прямоугольный массив, действуйте так, как показано ниже.
static void Main(string[] args) {
…
// Прямоугольный массив MD.
int[,] myMatrix;
myMatrix = new int[6,6];
// Заполнение массива (6 * 6).
for (int i = 0; i ‹ 6; i++) for (int j = 0; j ‹ 6; j++) myMatrix[i, j] = i * j;
// Печать массива (6 * 6).
for (int i = 0; i ‹ 6; i++) {
for(int j = 0; j ‹ 6; j++) Console.Write(myMatrix[i, j] + "\t");
Console.WriteLine();
}
…
}
На рис. 3.22 показан соответствующий вывод (обратите внимание на прямоугольный вид массива).
Читать дальше