Массивы в качестве параметров
Массивы могут передаваться в методы в качестве параметров, а также возвращаться из методов. Для возврата массива достаточно объявить массив как тип возврата. Наглядно это показано в следующем примере:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { foreach (string s in myReturn()) Console.WriteLine(s); int[] mySortArray = {4,1,2,5,3}; for (int i = 0; i <= 4; i++) mySortArray[i] = mySort(mySortArray, i); Console.WriteLine("\nОтсортированный массив:\n"); foreach (int i in mySortArray) Console.Write("\t"+i); Console.ReadLine(); } // Данный метод возвращает массив Info static Array myReturn() { string[] Info = {"Name","Family","Adress" }; return Info; } // Передача массива в метод в качестве параметра // Данный метод возвращает значение одного из индексов // отсортированного массива static int mySort(Array sortArray, int i) { Array.Sort(sortArray); return (int)sortArray.GetValue(i); } } }
Результат работы данной программы:
Ковариантость массивов
Для массивов поддерживается ковариантность. Это значит, что массив может быть объявлен как базовый тип, и его элементам могут присваиваться элементы производных типов. Однако, стоит отметить, что ковариантность массивов возможна только для ссылочных типов, но не для типов значений.
Добавлю, что с ковариантностью массивов связана проблема, которая может быть решена только через исключения времени выполнения.
Структура ArraySegment<T>
Структура ArraySegment<T> представляет сегмент массива. Эта структура может применяться, когда нужно вернуть или передать методу части массива. Вместо передачи в метод массива, смещения и счетчика в отдельных параметрах, можно передать единственный параметр ArraySegment<T>. В этой структуре информация о сегменте (смещение и счетчик) заключена непосредственно в ее членах:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int[] arr1 = { 1, 2, 3, 4, 5, 6 }; int[] arr2 = { 7, 8, 9, 10 }; var mySegmentsArray = new ArraySegment<int>[3] { // Инициализируем сегменты массивов new ArraySegment<int>(arr1,0,2), new ArraySegment<int>(arr2,0,1), new ArraySegment<int>(arr1,1,2) }; Console.WriteLine("Сумма выбранных значений равна:\n"+SumArraySegments(mySegmentsArray)); Console.ReadLine(); } // Метод, вычисляющий сумму выбранных сегментов static int SumArraySegments(ArraySegment<int>[] value) { int sum = 0; foreach (var s in value) for (int i = s.Offset; i < s.Offset + s.Count; i++) sum += s.Array[i]; return sum; } } }
Важно отметить, что сегменты массива не копируют элементы исходного массива. Вместо этого через ArraySegment<T> можно получить доступ к исходному массиву. Если изменяются элементы сегмента, то эти изменения будут видны в исходном массиве.
Комментарии