Массивы языка C#

Массив задает способ организации данных. Массивом называют упорядоченную совокупность элементов одного типа. Каждый элемент массива имеет индексы, определяющие порядок элементов. Число индексов характеризует размерность массива. Каждый индекс изменяется в некотором диапазоне [a,b]. В языке C#, как и во многих других языках, индексы задаются целочисленным типом.

Объявление массивов

Объявление одномерного массива выглядит следующим образом:

<тип>[] <объявители>;

Заметьте, в отличие от языка C++ квадратные скобки приписаны не к имени переменной, а к типу. Они являются неотъемлемой частью определения класса, так что запись T[] следует понимать как класс одномерный массив с элементами типа T.

Что же касается границ изменения индексов, то эта характеристика к классу не относится, она является характеристикой переменных - экземпляров, каждый из которых является одномерным массивом со своим числом элементов, задаваемых в объявителе переменной.

Как и в случае объявления простых переменных, каждый объявитель может быть именем или именем с инициализацией. В первом случае речь идет об отложенной инициализации. Нужно понимать, что при объявлении с отложенной инициализацией сам массив не формируется, а создается только ссылка на массив, имеющая неопределенное значение Null. Поэтому пока массив не будет реально создан и его элементы инициализированы, использовать его в вычислениях нельзя. Вот пример объявления трех массивов с отложенной инициализацией:

int[] a, b, c;

Чаще всего при объявлении массива используется имя с инициализацией. И опять-таки, как и в случае простых переменных, могут быть два варианта инициализации. В первом случае инициализация является явной и задается константным массивом. Вот пример:

double[] x= {5.5, 6.6, 7.7};

Следуя синтаксису, элементы константного массива следует заключать в фигурные скобки.

Во втором случае создание и инициализация массива выполняется в объектном стиле с вызовом конструктора массива. И это наиболее распространенная практика объявления массивов. Пример:

int[] d= new int[5];

Итак, если массив объявляется без инициализации, то создается только висячая ссылка со значением void. Если инициализация выполняется конструктором, то в динамической памяти создается сам массив, элементы которого инициализируются константами соответствующего типа (ноль для арифметики, пустая строка для строковых массивов), и ссылка связывается с этим массивом. Если массив инициализируется константным массивом, то в памяти создается константный массив, с которым и связывается ссылка.

Рассмотрим первый пример работы с массивами:

using System;

namespace Arrays
{
    class Program
    {
        private static Random rnd = new Random();
        static void Main(string[] args)
        {
            //объявляются три одномерных массива A,B,C
            int[] A = new int[5], B = new int[5], C = new int[5];
            CreateOneDimAr(A);
            CreateOneDimAr(B);
            for (int i = 0; i < 5; i++)
                C[i] = A[i] + B[i];
            //объявление массива с явной инициализацией
            int[] x ={ 5, 5, 6, 6, 7, 7 };
            //объявление массивов с отложенной инициализацией
            int[] u, v;
            u = new int[3];
            for (int i = 0; i < 3; i++) u[i] = i + 1;
            //v= {1,2,3}; //присваивание константного массива 
            //недопустимо
            v = new int[4];
            v = u; //допустимое присваивание
            int[,] w = new int[3, 5];
            //v=w; //недопустимое присваивание: объекты разных классов
            PrintAr1("A", A); PrintAr1("B", B);
            PrintAr1("C", C); PrintAr1("X", x);
            PrintAr1("U", u); PrintAr1("V", v);
            Console.ReadLine();
        }
        public static void CreateOneDimAr(int[] A)
        {
           for(int i = 0; i<A.GetLength(0);i++)
              A[i] = rnd.Next(1,100);
        }//CreateOneDimAr
        public static void PrintAr1(string name, int[] A)
        {
           Console.WriteLine(name);
           for(int i = 0; i<A.GetLength(0);i++)
              Console.Write("\t" + name + "[{0}]={1}", i, A[i]);
           Console.WriteLine();
        }//PrintAr1
    }
}

На что следует обратить внимание, анализируя этот текст: