Опубликован: 22.11.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Тверской государственный университет
Лекция 11:

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

< Лекция 10 || Лекция 11: 1234 || Лекция 12 >

Как обычно задаются элементы массива, если они не заданы при инициализации? Они либо вычисляются, либо вводятся пользователем. Давайте рассмотрим первый пример работы с массивами из проекта с именем Arrays, поддерживающего эту лекцию:

public void TestDeclaration()
{
	//объявляются три одномерных массива A,B,C
	int[] A = new int[5], B= new int[5], C= new int[5];
	Arrs.CreateOneDimAr(A);
	Arrs.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; //недопустимое присваивание: объекты разных классов
	Arrs.PrintAr1("A", A); Arrs.PrintAr1("B", B);
	Arrs.PrintAr1("C", C); Arrs.PrintAr1("X", x);
	Arrs.PrintAr1("U", u); Arrs.PrintAr1("V", v);
}

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

  • В процедуре показаны разные способы объявления массивов. Вначале объявляются одномерные массивы A, B и C, создаваемые конструктором. Значения элементов этих трех массивов имеют один и тот же тип int. То, что они имеют одинаковое число элементов, произошло по воле программиста, а не диктовалось требованиями языка. Заметьте, что после такого объявления с инициализацией конструктором, все элементы имеют значение, в данном случае - ноль, и могут участвовать в вычислениях.
  • Массив x объявлен с явной инициализацией. Число и значения его элементов определяется константным массивом.
  • Массивы u и v объявлены с отложенной инициализацией. В последующих операторах массив u инициализируется в объектном стиле - элементы получают его в цикле значения.
  • Обратите внимание на закомментированный оператор присваивания. В отличие от инициализации, использовать константный массив в правой части оператора присваивания недопустимо. Эта попытка приводит к ошибке, поскольку v - это ссылка, которой можно присвоить ссылку, но нельзя присвоить константный массив. Ссылку присвоить можно. Что происходит в операторе присваивания v = u? Это корректное ссылочное присваивание: хотя u и v имеют разное число элементов, но они являются объектами одного класса. В результате присваивания память, отведенная массиву v, освободится, ею займется теперь сборщик мусора. Обе ссылки u и v будут теперь указывать на один и тот же массив, так что изменение элемента одного массива немедленно отразится на другом массиве.
  • Далее определяется двумерный массив w и делается попытка выполнить оператор присваивания v=w. Это ссылочное присваивание некорректно, поскольку объекты w и v - разных классов и для них не выполняется требуемое для присваивания согласование по типу.
  • Для поддержки работы с массивами создан специальный класс Arrs, статические методы которого выполняют различные операции над массивами. В частности, в примере использованы два метода этого класса, один из которых заполняет массив случайными числами, второй - выводит массив на печать. Вот текст первого из этих методов:
public static void CreateOneDimAr(int[] A)
{
	for(int i = 0; i<A.GetLength(0);i++)
		A[i] = rnd.Next(1,100);
}//CreateOneDimAr

Здесь rnd - это статическое поле класса Arrs, объявленное следующим образом:

private  static Random rnd = new Random();

Процедура печати массива с именем name выглядит так:

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

На рис. 11.1 показан консольный вывод результатов работы процедуры TestDeclarations.

Результаты объявления и создания массивов

Рис. 11.1. Результаты объявления и создания массивов

Особое внимание обратите на вывод, связанный с массивами u и v.

< Лекция 10 || Лекция 11: 1234 || Лекция 12 >
Александр Галабудник
Александр Галабудник

Не обнаружил проекты, которые используются в примерах в лекции, также не увидел список задач.

Александра Гусева
Александра Гусева
Сергей Кузнецов
Сергей Кузнецов
Россия, Москва
Pavel Kuchugov
Pavel Kuchugov
Россия, Московский инженерно-физический институт, 2010