Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Ватсон К. -> "С#" -> 58

С# - Ватсон К.

Ватсон К. С# — Лори, 2005 . — 879 c.
ISBN 1-861004-98-2
Скачать (прямая ссылка): vatsonc2005.pdf
Предыдущая << 1 .. 52 53 54 55 56 57 < 58 > 59 60 61 62 63 64 .. 404 >> Следующая


)

>
114

Глава б

3. Запустите программу (см. рис. слева).

Как это работает

В этом примере функция sumvaiso описана с использованием ключевого слова-рагашз, что позволяет ей принимать произвольное количество параметров типа int (и никакого другого):

static int sumVale(params int[] vals)

(

)

Код в этой функцин проходит в цикле все значения массива vals и суммирует их,

. возвращая получившийся результат.

Мы вызываем эту функцию нз Main о с пятью целыми параметрами:

int sum 9 sumVals {1, 5, 2, 9, 8);

Однако можно с тем же успехом вызвать эту функцию, передавая ей ноль, один, два или сто параметров целого типа: никаких ограничений на количество задаваемых параметров не существует.

Передача параметров по ссылке и по значению

Во всех предыдущих функциях применялись параметры, передаваемые по зиа-чению. Другими словами, мы передавали значение в переменную, которая затем использовалась внутри функции. Любые изменения, которые эта переменная претерпевала внутри функцин, не оказывали никакого влияния на параметр, использованный при вызове функцин. В качестве примера рассмотрим функцию, которая удваивает передаваемый ей параметр и выводит результат на экран:

' ¦- etaticvoid showDouble(int val) val *• 2;

Console.WriteLine(*val doubled * {0}', val);

В этой функции происходит удвоение передаваемого параметра. Если же мы вызовем эту функцию следующим образом:

int myNumber > 5;
Console.WriteLine('myNumber “ {0}', myNumber);
ehowDoub^(myNumber)i
Console.WriteLine('myNumber • CO)*, myNumber);

то выходной поток, выведенный иа консоль, будет таким:

myNumber = 5 val doubted = 10 myNumber = 5

Вызов функции showDoubleO с переменной myNumber в качестве параметра не оказывает никакого влияния на переменную myNumber, описанную в HainD, несмотря на то, что параметр, которому присваивается ее значение, удваивается.

‘ ¦¦ I 11 I Г! I ¦ i1 U ¦ к I 11 I ¦ г: А11

Simniul Uj.lues 2IFj

TVtiTli л пи |(*iy t:ii cnnl in и г

in I

IT.

P

¦d
Функции

115

Все это хорошо, но если мы пожелаем, чтобы значение переменной myNumber было изменено, возникнет проблема. Конечно, можно воспользоваться функцией, которая возвращает новее значение переменной шуишпЬег, н вызвать ее следующим образом:

int royNumber = 5;

Console .WriteLine ("r^Number = {0 )*, myNumber)j

щуHumber - ehowDouble(rnyNumber) j

Console.WriteLine('myNumber = {0}', myNumber)j

Однако в таком коде довольно трудно разобраться; кроме того, такой способ не позволяет отразить изменения значений переменных, используемых в качестве параметров (поскольку функции всегда возвращают только одно значение),

Вместо этого следует передавать параметр по ссылке. Это означает, что функция будет работать именно с той переменной, которая использовалась при вызове функции, а не с переменной, которая имеет то же значение. Следовательно, любые изменения переменной, использовавшейся функцией, отразятся на значении переменной, использовавшейся в качестве параметра. Для этого при описании параметра необходимо воспользоваться ключевым словом ref:

static void showDoublefref int val) -

(

val *= 2;

Console.WriteLine('val doubled = (0)', val) i

}

Вторично ключевое слово ref необходимо использовать при вызове функции (это обязательное требование, поскольку тот факт, что параметр описан как ref, является неотъемлемой частью сигнатуры функции):

int myNumber “ S;

Console.WriteLine('myNumber = {01*. myNtomber); ahowDoubletref myNumber)j

Console.WriteLine! 'ityNumber = {0)', myNumber);

В этом случае на консоль будет выведен следующий текст:

myNumber = 5 val doubled = 10 myNumber =10

На этот раз переменная myNumber была изменена в функции showDoubieO,

Для переменных, используемых в качестве параметров типа ref, имеются два ограничения. Во-первых, поскольку существует вероятность, ч+о в результате вызова функции значение вызываемого по ссылке параметра будет изменено, то при вызове функции запрещается использовать переменные типа const. Отсюда следует, что следующий вызов является недопустимым:

congt int nyNumber « 5

Console.WriteLine('myNumber - (0)*, myNumber); showDouble(ref myNumber) j

Console.WriteLine('myNumber = {О}', myNumber);

Во-вторых, необходимо использовать заранее инициализированную переменную. C# не гарантирует, что параметр типа ref будет инициализирован той функцией, в которой он используется. Следующий код также является недопустимым:

ine myNumber; showDouble(ref myNumber)j

Console.WriteLinel'myNumber = (0)', rnyNunber);
116

Глава 6

Выходные параметры

В дополнение к возможности передавать параметры по ссылке мы можем указать, что данный параметр является выходным: в описание такого параметра включается ключевое слово out, используемое так же, как и ключевое слово ref (в качестве модификатора параметра в описании функцин н при вызове функции). Фактически этот способ предоставляет почти такие же возможности, что и передача параметров по ссылке, в том смысле, что значенне параметра после выполнения функции попадает в переменную, использовавшуюся при вызове этой функции. Имеются, однако, и существенные отличия. Хотя использовать переменную, которой не присвоено начальное значение, в качестве параметра типа ref недопустимо, она может применяться в качестве параметра типа out. Более того, параметр типа out будет рассматриваться как не имеющий начального значения самой функцией, в которой он используется. Это означает, что хотя передача переменной, которой присвоено некоторое значенне, в качестве параметра типа out является допустимой, однако в процессе выполнения функции хранящееся в этой переменной значение будет утрачено.
Предыдущая << 1 .. 52 53 54 55 56 57 < 58 > 59 60 61 62 63 64 .. 404 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.