Массивы в качестве параметров
C# --- Руководство по C# --- Массивы в качестве параметров
Массивы могут передаваться в методы в качестве параметров, а также возвращаться из методов. Для возврата массива достаточно объявить массив как тип возврата. Наглядно это показано в следующем примере:
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> можно получить доступ к исходному массиву. Если изменяются элементы сегмента, то эти изменения будут видны в исходном массиве.