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

72

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

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> можно получить доступ к исходному массиву. Если изменяются элементы сегмента, то эти изменения будут видны в исходном массиве.

Пройди тесты
Лучший чат для C# программистов