Российский Государственный Технологический Университет им. К.Э. Циолковского
Опубликован: 02.03.2007 | Доступ: свободный | Студентов: 5678 / 802 | Оценка: 3.96 / 3.45 | Длительность: 27:04:00
ISBN: 978-5-9556-0086-4
Лекция 5:

Массивы

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >

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

В качестве параметра методу всегда можно передать ссылку на массив — в частности, ссылку на ОДНОМЕРНЫЙ массив, первая спецификация размерности которого в объявлении имеет вид ...[] ... .

Тип и количество составляющих данный массив компонентов для механизма передачи параметров значения не имеют. Важно, что в стеке будет выделено определенное (соответствующее значению первой размерности) количество проинициализированных ссылок на составляющие данный одномерный массив элементы.

Этот принцип действует во всех случаях, в том числе и при вызове приложения из командной строки с передачей ему в качестве параметров массива ОДНОТИПНЫХ (строковых) значений:

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.
< Лекция 4 || Лекция 5: 12345 || Лекция 6 >
kewezok kewezok
kewezok kewezok
Елена Шляхт
Елена Шляхт
Объясните плиз в чем отличие а++ от ++а
Почему результат разный?
int a=0, b=0;
Console.WriteLine(a++); //0
Console.WriteLine(++b); //1
a++;
++b;
Console.WriteLine(a); //2
Console.WriteLine(b); //2