Чтение онлайн

на главную - закладки

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:

• В этом цикле с тем же успехом можно было бы использовать и имя массива children. Свойство Length для него возвращает число элементов верхнего уровня, совпадающее, как уже говорилось, с числом элементов массива Fathers.

• Во внутреннем цикле свойство Length вызывается для каждого элемента children [i], который является массивом.

• Остальные детали, надеюсь, понятны.

Приведу вывод, полученный в результате работы процедуры PrintAr3

Рис. 11.3. Дерево "Отцы

и дети"

Процедуры и массивы

В наших примерах массивы неоднократно передавались процедурам в качестве входных аргументов и возвращались в качестве результатов.

В лекции 9 подробно описывались особенности передачи аргументов в процедуру. Остается подчеркнуть только некоторые детали:

• В процедуру достаточно передавать только сам объект — массив. Все его характеристики {размерность, границы) можно определить, используя свойства и методы этого объекта.

• Когда массив является выходным аргументом процедуры, как аргумент C в процедуре MuitMatr, выходной аргумент совсем не обязательно снабжать ключевым словом ref или out (хотя и допустимо). Передача аргумента по значению в таких ситуациях так же хороша, как и передача по ссылке. В результате вычислений меняется сам массив в динамической памяти, а ссылка на него остается постоянной. Процедура и ее вызов без ключевых слов выглядит проще, поэтому обычно они опускаются. Заметьте, в процедуре Getsizes, где определялись границы массива, ключевое слово out, сопровождающее аргументы, совершенно необходимо.

• Может ли процедура-функция возвращать массив в качестве результата? В C# ответ на этот вопрос положителен. В следующей лекции будет приведен пример подобной функции.

12. Класс Array и новые возможности массивов

Семейство классов-массивов. Родительский класс Array и наследуемые им интерфейсы. Новые возможности массивов в С#. Как корректно работать с массивами объектов?

Класс Array

Нельзя понять многие детали работы с массивами в С#, если не знать устройство класса Array из библиотеки FCL, потомками которого являются все классы-массивы. Рассмотрим следующие объявления:

//Класс Array

int[] ar1 = new int [5];

doublet] ar2 ={5.5, 6.6, 7.7};

int [,] ar3 = new Int32[3,4];

Зададимся естественным вопросом: к какому или к каким классам принадлежат объекты ar1, аr2 и аr3? Ответ прост: все они принадлежат к разным классам. Переменная ar1 принадлежит к классу int [] — одномерному массиву значений типа int, ar2 — double[] — одномерному массиву значений типа double, аr3 — двумерному массиву значений типа int. Следующий закономерный вопрос: а что общего есть у этих трех объектов? Прежде всего, все три класса этих

объектов, как и другие классы, являются потомками класса object, а потому имеют общие методы, наследованные от класса object и доступные объектам этих классов.

У всех классов, являющихся массивами, много общего, поскольку все они являются потомками класса System.Array. Класс System.Array наследует ряд интерфейсов: ICIoneable, IList, ICollection, Innumerable, а, следовательно, обязан реализовать все их методы и свойства. Помимо наследования свойств и методов класса Object и вышеперечисленных интерфейсов, класс Array имеет довольно большое число собственных методов и свойств. Взгляните, как выглядит отношение наследования на семействе классов, определяющих массивы.

Рис. 12.1. Отношение наследования на классах-массивах

Благодаря такому мощному родителю, над массивами определены самые разнообразные операции — копирование, поиск, обращение, сортировка, получение различных характеристик. Массивы можно рассматривать как коллекции и устраивать циклы For Each для перебора всех элементов. Важно и то, что когда у семейства классов есть общий родитель, то можно иметь общие процедуры обработки различных потомков этого родителя. Для общих процедур работы с массивами характерно, что один или несколько формальных аргументов имеют родительский тип Array. Естественно, внутри такой процедуры может понадобиться анализ — какой реальный тип массива передан в процедуру.

Рассмотрим пример подобной процедуры. Ранее я для печати элементов массива использовал различные процедуры PrintAr1, PrintAr2 и так далее, по одной для каждого класса массива. Теперь я приведу общую процедуру, формальный аргумент которой будет принадлежать родителю всех классов-массивов, что позволит передавать массив любого класса в качестве фактического аргумента:

public static void PrintAr(string name, Array A)

{

Console.WriteLine(name);

switch (A.Rank)

{

case 1:

for (int i = 0; i<A.GetLength(0);i + +)

Console.Write("\t" + name + "[{0}]={1}", i, A.GetValue (i));

Console.WriteLine ;

break;

case 2:

for (int i = 0; i<A.GetLength(0);i + +)

{

for (int j = 0; j<A.GetLength(1);j++)

Console.Write("\t" + name + "[{0},{1}]={2 } ", i,j, A.GetValue(i,j));

Console.WriteLine ;

}

break;

default: break;

}

}//PrintAr

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

public void TestCommonPrint

{

// Класс Array

int[] ar1 = new int [5];

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

int [,] ar3 = new Int32[3,4];

Arrs.CreateOneDimAr(ar1);Arrs.PrintAr("ar1", ar1);

Arrs.PrintAr("ar2", ar2);

Arrs.CreateTwoDimAr(ar3);Arrs.PrintAr("ar3", ar3);

}//TestCommonPrint

Вот результаты вывода массивов ar1, аr2 и аr3.

Поделиться:
Популярные книги

Брачный сезон. Сирота

Свободина Виктория
Любовные романы:
любовно-фантастические романы
7.89
рейтинг книги
Брачный сезон. Сирота

Адвокат империи

Карелин Сергей Витальевич
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Адвокат империи

Лейб-хирург

Дроздов Анатолий Федорович
2. Зауряд-врач
Фантастика:
альтернативная история
7.34
рейтинг книги
Лейб-хирург

Измена. Верни мне мою жизнь

Томченко Анна
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Верни мне мою жизнь

На границе империй. Том 5

INDIGO
5. Фортуна дама переменчивая
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
На границе империй. Том 5

Бастард Императора. Том 2

Орлов Андрей Юрьевич
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бастард Императора. Том 2

На изломе чувств

Юнина Наталья
Любовные романы:
современные любовные романы
6.83
рейтинг книги
На изломе чувств

Буревестник. Трилогия

Сейтимбетов Самат Айдосович
Фантастика:
боевая фантастика
5.00
рейтинг книги
Буревестник. Трилогия

Убивать чтобы жить 6

Бор Жорж
6. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 6

Приватная жизнь профессора механики

Гулиа Нурбей Владимирович
Проза:
современная проза
5.00
рейтинг книги
Приватная жизнь профессора механики

Башня Ласточки

Сапковский Анджей
6. Ведьмак
Фантастика:
фэнтези
9.47
рейтинг книги
Башня Ласточки

Два мира. Том 1

Lutea
Фантастика:
фэнтези
попаданцы
мистика
5.00
рейтинг книги
Два мира. Том 1

Отрок (XXI-XII)

Красницкий Евгений Сергеевич
Фантастика:
альтернативная история
8.50
рейтинг книги
Отрок (XXI-XII)

Все ведьмы – стервы, или Ректору больше (не) наливать

Цвик Катерина Александровна
1. Все ведьмы - стервы
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Все ведьмы – стервы, или Ректору больше (не) наливать