Массивы
Массивы как параметры
В качестве параметра методу всегда можно передать ссылку на массив — в частности, ссылку на ОДНОМЕРНЫЙ массив, первая спецификация размерности которого в объявлении имеет вид ...[] ... .
Тип и количество составляющих данный массив компонентов для механизма передачи параметров значения не имеют. Важно, что в стеке будет выделено определенное (соответствующее значению первой размерности) количество проинициализированных ссылок на составляющие данный одномерный массив элементы.
Этот принцип действует во всех случаях, в том числе и при вызове приложения из командной строки с передачей ему в качестве параметров массива ОДНОТИПНЫХ (строковых) значений:
using System; class C1 { static void Main(string[] args) { Console.WriteLine("Values of parameters:"); for (int i = 0; i < args.Length; i++) { Console.WriteLine("{0}: {1}", i, args[i]); } } }
Сначала создается консольное приложение (пусть под именем ConLine, в файле ConLine.cs ).
Транслятор можно запустить из командной строки, выглядит это примерно так:
C:> csc /t:exe ConLine.cs
Результат деятельности транслятора размещается в .exe-файле под именем ConLine.exe и также может быть запущен из командной строки с передачей строк символов в качестве входных параметров:
C:>ConLine qwerty asdfgh zxcvbn ok ok ok–k
В окне консольного приложения отобразится следующее множество строк:
Values of parameters: 0: qwerty 1: asdfgh 2: zxcvbn 3: ok 4: ok 5: ok–k
А теперь с использованием оператора foreach:
using System; class C1 { static void Main(string[] args) { Console.WriteLine("Values of parameters, using foreach:"); foreach (string arg in args) { Console.WriteLine("{0}", arg); } } }
Запускаем:
C:>ConLine qwerty asdfgh zxcvbn ok ok ok–k
Получаем:
Values of parameters, using foreach: qwerty asdfgh zxcvbn ok ok ok–k
Полностью построенный массив можно передать в качестве входного параметра методу.
Пустая ссылка на массив может быть передана методу в качестве выходного параметра.
Например:
int[] myArray; // myArray == null PrintArray(myArray);
Передаваемый в качестве параметра массив может быть предварительно проинициализирован:
// cs_sd_arrays.cs using System; public class ArrayClass { static void PrintArray(string[] w) { for (int i = 0 ; i < w.Length ; i++) { Console.Write(w[i] + "{0}", i < w.Length – 1 ? " " : ""); } Console.WriteLine(); } public static void Main() { // Declare and initialize an array: string[] WeekDays = new string [] {"Sun","Sat","Mon","Tue","Wed","Thu","Fri"}; // Pass the array as a parameter: PrintArray(WeekDays); } }
Еще один пример совмещения инициализации массива с его передачей как параметра методу. Перебор элементов массива реализуется в соответствии с правилом индексации:
using System; public class ArrayClass { static void PrintArray(int[,] w) { // Display the array elements: for (int i=0; i < 4; i++) for (int j=0; j < 2; j++) Console.WriteLine("Element({0},{1})={2}", i, j, w[i,j]); } public static void Main() { // Pass the array as a parameter: PrintArray(new int[,] {{1,2}, {3,4}, {5,6}, {7,8}}); } }
Спецификатор params
Неопределенное (переменное) количество (ОДНОТИПНЫХ!) параметров или список параметров переменной длины передается в функцию в виде ссылки на одномерный массив. Эта ссылка в списке параметров функции должна быть последним элементом списка параметров. Ссылке должен предшествовать спецификатор params.
В выражении вызова метода со списком параметров, члены списка могут присутствовать либо в виде списка однотипных значений (этот список преобразуется в массив значений), либо в виде ссылки на ОДНОМЕРНЫЙ массив значений определенного типа:
using System; class Class1 { // Методы, принимающие списки параметров переменной длины. // Их объявление. Единственный параметр способен принимать // массивы значений переменной длины. static void f1(params int[] m) { Console.WriteLine(m.Length.ToString()); } static void f2(params int[][,] p) { Console.WriteLine(p.Length.ToString()); } static void Main(string[] args) { // Выражения вызова. На основе списков однотипных // значений формируются массивы. f1(0,1,2,3,4,5); f1(0,1,2,3,4,5,6,7,8,9,10); f2(new int[,]{{0,1},{2,3}}, new int[,]{{0,1,2,3,4,5},{6,7,8,9,10,11}}); f2(new int [,]{{0,1},{2,3}}); } }Листинг 5.2.