Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Заочники_АСОИ / Лекции / 02 Массивы и кортежи / Массивы, кортежи, перечисления.docx
Скачиваний:
32
Добавлен:
29.02.2016
Размер:
110.14 Кб
Скачать

Массивы в качестве параметров

Массивы могут передаваться в методы в качестве параметров, а также возвращаться из методов. Для возврата массива достаточно объявить массив как тип возврата, как показано в следующем методе GetPersons():

static Person[] GetPersons()

{

return new Person [ ] {

new Person { FirstName="Damon", LastName="Hill" },

new Person { FirstName="Niki", LastName="Lauda" },

new Person { FirstName="Ayrton", LastName="Senna" },

new Person { FirstName="Graham", LastName="Hill" }

};

}

Для передачи массивов в метод массив объявляется в параметре, как показано в следую­щем методе DisplayPersons():

static void DisplayPersons(Person[] persons)

{

//...

Ковариантость массивов

Для массивов поддерживается ковариантность. Это значит, что массив может быть объ­явлен как базовый тип, и его элементам могут присваиваться элементы производных ти­пов. Например, можно объявить параметр типа object[] и передать в нем Person[]:

static void DisplayArray(object[] data) .

{

//...

}

Ковариантность массивов возможна только, для ссылочных типов, но не для ти­пов значений.

С ковариантностью массивов связана проблема, которая может быть решена толь­ко через исключения времени выполнения. Если присвоить массив Person массиву object, mo массив object затем может быть использован со всем, что наследует­ся от object. Например, компилятор разрешит передавать строки в элементах такого массива. Однако, поскольку на самом деле ссылка на массив Person производится через массив object, возникает исключение времени выполнения.

Структура ArraySegment<T>

Структура ArraySegment<T> представляет сегмент массива. Это структура может при­меняться, когда нужно вернуть или передать методу части массива. Вместо передачи в ме­тод массива, смещения и счетчика в отдельных параметрах, можно передать единствен­ный параметр ArraySegment<T>. В этой структуре информация о сегменте (смещение и счетчик) заключена непосредственно в ее членах.

Метод SumOfSegments принимает массив элементов ArraySegment<int> для вычисле­ния суммы всех целых чисел, определенных в сегменте, и возвращает эту сумму:

static int SumOfSegments(ArraySegment<int>[] segments)

{

int sum =0;

foreach (var segment in segments)

{

for (int i=segment.Offset; i<segment.Offset+segment.Count; i++)

{

sum += segment.Array[i];

}

}

return sum;

}

Этот метод используется посредством передачи массива сегментов. Первый элемент массива ссылается на три элемента ar1, начиная с первого, а второй элемент  на три элемента аr2, начиная с четвертого:

int[] ar1 = { 1, 4, 5, 11, 13, 18 };

int[] ar2 = { 3, 4, 5, 18, 21, 27, 33 };

var segments = new ArraySegment<int>[2]

{

new ArraySegment<int>(ar1, 0, 3),

new ArraySegment<int>(ar2, 3, 3)

} ;

var sum = SumOfSegments(segments);

Важно отметить, что сегменты массива не копируют элементы исходного мас­сива. Вместо этого через ArraySegment<T> можно получить доступ к исходно­му массиву Если изменяются элементы сегмента, то эти изменения будут видны в исходном массиве.