Вторник, 16.04.2024, 15:34
Приветствую Вас Гость | RSS

Лекции

Меню сайта
Форма входа
Категории раздела
ТАУ (Теория автоматического управления) [31]
лекции по ТАУ
Экология [151]
учебник
Бухгалтерский учет и налогообложение в строительстве [56]
Дементьев А.Ю. - Практическое пособие
Психология [104]
Пип
информатика [80]
с# Карли Ватсон
современные стулья [0]
новинки
Поиск

Главная » 2010 » Февраль » 11 » Параметры
00:16
Параметры
Параметры
Если функция должна получать параметры, то необходимо задать:
• Список принимаемых функцией параметров в ее описании,
а также типы этих параметров
• Совпадающий список параметров при каждом вызове функции
Это предполагает использование следующего кода:
s t a t i c <БозвращаемыйТип> <имяФункции>{<типПараметра> <имя11араметра>, . . . )
{ • : . :...-;• :/::7
r e t u r n <возвращаемоеЗначение>;
} .•."•. 'ШШШ
Здесь может быть произвольное число параметров, для каждого из которых указы-
ваются тип и имя. В качестве разделителя между параметрами ставятся запятые.
Каждый из параметров доступен внутри данной функции в качестве переменной.
Например, следующая простая функция принимает два параметра типа double
и возвращает их произведение:
static double product (double paraml, double param2)
• • • • • • • : • . . { • : • • • • • • •• • • • • • •• - • ' • . •;••• : • •; • • • • • • • : '•• : • •• • ':::: • • • ' • • • • • .:
: : . . , ;
return paraml * param2; ;.'.', ; . ^ . . ...
Теперь перейдем к рассмотрению более сложного примера.
Практикум: обмен данными с функцией
1. Создайте новое консольное приложение с именем chO6ExO2
В директории C:\BegCSharp\Chapter6.
2. Добавьте следующий код в ciassi.cs:
class Classl
static int MaxValue(int[] intArray)
int maxVal = intArrayCO];
for (int i = 1; i < int Array .Length; i++)
if (intArrayti] > maxVal)
maxVal = intArrayti];
return maxVal;
Функции 111
static void Main (string [] args)
{
int[] myArray = {1, 8, 3, 6, 2, 5, 9, 3, 0, 2};
int maxVal - MaxValue(myArray) ;
Console.WriteLine("The maximum value in myArray is {О}", maxVal) ,
3. Запустите программу:
\ Ш\ 1 C:\BegCSharp\Chapter6\ChO
Как это работает
Данный код содержит функцию, которая решает обсуждавшуюся в начале этой
главы задачу. Функция принимает в качестве параметра массив целых чисел и воз-
вращает наибольшее из них. Ее описание имеет следующий вид:
static int MaxValue(int[] intArray)
int maxVal = intArray[0];
for (int i = 1; i < intArray.Length; i++)
if (intArray[i] > maxVal)
maxVal = intArray[i];
return maxVal;
Данная функция — MaxvaiueO —имеет один параметр, который описан как
массив типа int с именем intArray. Возвращаемое значение также имеет тип int.
Определение максимального значения представляет собой несложную задачу. Ло-
кальной целой переменной с именем maxVal в качестве начального значения при-
сваивается первый элемент массива, а затем. производится сравнение этого
значения последовательно со всеми остальными элементами. Если текущий эле-
мент больше, чем значение переменной maxval, то текущее значение maxVal заме-
няется на это значение. Когда выполнение цикла завершено, переменная maxval
содержит наибольшее значение данного массива, которое и возвращается операто-
ром return.
Код, расположенный в Main (), объявляет и инициализирует простой целый
массив, который будет использоваться совместно с функцией MaxvaiueO:
i n t f j myArray = {1# 8, 3, 6, 2, 5, 9, 3, 0, 2};
При вызове функции MaxvaiueO значение присваивается переменной Maxval
типа int:
i n t maxVal = MaxValue (myArray) ;
Затем МЫ ВЫВОДИМ ЭТО Значение на экран С ПОМОЩЬЮ Console.WriteLine () I
Console.WriteLine(*The maximum value in myArray i s {0}", maxVal) ;
112 Глава 6
Соответствие параметров
При вызове функции ее параметры должны в точности соответствовать ее опи-
санию. Необходимо совпадение типов параметров, их количества и порядка их сле-
дования. Это означает, что, например, функция:
static void myFunction (string myString, double myDouble)
{
ШШ:-• - ' Ш Ш Ш5>'• У Ж '• •"•••: /: ; • • = •:>:: : •: • -- ^'•:". • •' v ' :: •••••:' •- ^:•: : ; 4 V^/; ; : X i ^ L 'Ш 1Щ?; : f ЩЖШ
не может быть вызвана с использованием строки:
myFunction(2.6, " H e l l o " ) ;
В данном случае мы пытаемся передать значение типа double в качестве перво-
го параметра, а значение типа string — в качестве второго, что не соответствует
порядку, в котором эти параметры содержатся в описании функции. Нельзя исполь-
зовать и такую строку:
myFunction("Hello");
поскольку в ней передается только один параметр типа string вместо двух обяза-
тельных параметров.
Попытка воспользоваться любой из этих двух строк для вызова функции приве-
дет к ошибке при компиляции, так как компилятор налагает требование точного
соответствия сигнатурам вызываемых функций.
Возвращаясь к предыдущему примеру, такое требование означает, что функция
Maxvalue () может использоваться только для получения максимального целого из
массива целых чисел. Если мы изменим код в Main о следующим образом:
static void Main (string [] args)
{
doublet] myArray = {1.3, 8.9, 3.3, 6.5, 2.7, 5.3};
iW:;::;Ш>-, double maxVal = MaxValue (myArray) ;
Console.WriteLineCThe maximum value in myArray is {0}", maxVal) ;
}
то такой код не пройдет процедуру компиляции из-за неверного типа параметра.
Ниже, в разделе, посвященном перегрузке операторов, вы познакомитесь с очень
полезным способом, позволяющим решить эту проблему.
Массивы параметров
В С# предусмотрена возможность задания одного (и только одного) специаль-
ного параметра функции. Этот параметр, который обязательно должен располагаться
последним, известен под названием массива параметров. Он позволяет при обраще-
нии к функциям использовать переменное количество параметров. Массив пара-
метров описывается посредством ключевого слова params.
Массивы параметров служат одним из способов упрощения кода, поскольку
благодаря им не приходится передавать массивы из вызывающего кода. Напротив,
можно передать несколько параметров одного и того же типа, которые помещают-
ся в массив для последующего использования внутри функции.
При описании функции с массивом параметров применяется следующий код:
static <возвращаемыйТип> <имяФункции>{<п1Тип> <п1Имя>, ,..,
params <тип>[] <имя>)
; '
Функции 113
return <возвращаемоеЗначение>;
Для того чтобы вызвать эту функцию, потребуется следующий код:
<имяФункции> (<п1 >, . . . , <значение1>, <значение2>, . . .) ;
В данном случае <значение1>, <значение2> и Т.Д.— ЭТО Значения ТИПа <тип>.
Они используются для инициализации массива с именем <имя>. Никаких ограниче-
ний на количество параметров, которые могут быть здесь заданы, не существует;
единственное предъявляемое к ним требование — они все должны быть одного
типа <тип>. Можно вообще не задавать ни одного параметра.
Эта последняя особенность делает массивы параметров полезными, в частности,
при задании некоторой дополнительной информации, которая будет использовать-
ся функцией. Например, допустим, что имеется функция getwordo, которая при-
нимает значение типа string в качестве первого параметра и возвращает первое
слово из этой строки:
string firstWord = getWord("This is a sentence.*);
Переменной firstword будет присвоена строка 'This*.
Мы можем добавить в функцию getwordo параметр params, который позволит
выбирать и возвращать другое слово по его индексу:
string firstWord = getWord(*This is a sentence.*, 2) ;
Если исходить из предположения, что нумерация слов начинается с 1, то в резуль-
тате такого вызова переменной firstWord будет присвоена строка "is*.
Можно ограничить количество возвращаемых символов, введя третий пара-
метр, что совершенно допустимо для параметра params:
string firstWord = getWord{*This is a sentence.*, 4, 3).;
В этом случае переменной f irstword будет присвоена строка *sen*.
Давайте разберем пример полностью.
Практикум: обмен данными с функцией (часть 2)
1. Создайте новое консольное приложение с именем спОбЕхОЗ
В директории C:\BegCSharp\Chapter6.
2. Добавьте следующий код в ciassi.cs:
class Classl
sum += val;
return sum;
static void Main (string [] args)
{
int sum = sumValsd, 5, 2, 9, 8) ;
Console.WriteLineCSummed Values = {0}*, sum);
114 Глава 6
t?vC:\BegCSharp\Chaptere\Ch06EK03\bin\Debug\
Sunnsed Ualiies = 25
Press any key to continue
3. Запустите программу
(см. рис. слева).
Как это работает
В этом примере функция sumVals о описана с использованием ключевого слова-
params, что позволяет ей принимать произвольное количество параметров типа int
(и никакого другого):
static int sumVals(params int[] vals)
Код в этой функции проходит в цикле все значения массива vals и суммирует их,
возвращая получившийся результат.
Мы вызываем эту функцию из Main о с пятью целыми параметрами:
i n t sum = sumVals (1, 5, 2, 9, 8) ;
Однако можно с тем же успехом вызвать эту функцию, передавая ей ноль, один,
два или сто параметров целого типа: никаких ограничений на количество задавае-
мых параметров не существует.
Передача параметров по ссылке и по значению
Во всех предыдущих функциях применялись параметры, передаваемые по зна-
. чению. Другими словами, мы передавали значение в переменную, которая затем
использовалась внутри функции. Любые изменения, которые эта переменная пре-
терпевала внутри функции, не оказывали никакого влияния на параметр, исполь-
зованный при вызове функции. В качестве примера рассмотрим функцию, которая
удваивает передаваемый ей параметр и выводит результат на экран:
";:^^;:;;:;^•;;:::;":;;:;'";;^Я-:;::;г;;";:;;•:•:;::ене;Г-;^v;•"• ;i; 1У:^Я;:^:й;•;-::^::=;^:;;::;:;;";^";;::::•;•:J';•:П;;:::^:;:;::":г:;:;;:;;:•";:;:::::;•;;:;-;:;:":";;;•;:Я:•;;;::;•••::::;KV;!;:П;^:;:;-;::::р;;:i;:;;:;':1;:;;::;;;;;;•;;=:ГИТ;^:;:;::::;;;:;;:;!Т;;;"3::^:;:::;;•;•:-;:!;:;•::•;:;:";:• Р:•;;г;;;:;:;'ф;-:;::::• :Y;;:;;:':-:;:;; } Щ Щ
val *= 2;
Console.WriteLine(*val doubled = { 0 } * , v a l ) ;
В этой функции происходит удвоение передаваемого параметра. Если же мы вызо-
вем эту функцию следующим образом:
. int my Number = 5; . • :: • • • : . • . .••••,
Console.WriteLine(*myNumber = {0}*, myNumber);
showDouble(myNumber) ;
Console.WriteLine("myNumber = {0}*, myNumber);
то выходной поток, выведенный на консоль, будет таким:
myNumber = 5
val doubled = 10
myNumber = 5
Вызов функции showDoubleO с переменной myNumber в качестве параметра не
оказывает никакого влияния на переменную myNumber, описанную в Main о , несмот-
ря на то, что параметр, которому присваивается ее значение, удваивается.
Функции 115
Все это хорошо, но если мы пожелаем, чтобы значение переменной myNumber
было изменено, возникнет проблема. Конечно, можно воспользоваться функцией,
которая возвращает новое значение переменной myNumber, и вызвать ее следую-
щим образом:
int myNumber = 5;
Console.WriteLine("myNumber = {0}", myNumber);
myNumber = showDouble(myNumber);
Console.WriteLine('myNumber = {0}•, myNumber);
Однако в таком коде довольно трудно разобраться; кроме того, такой способ не
позволяет отразить изменения значений переменных, используемых в качестве
параметров (поскольку функции всегда возвращают только одно значение).
Вместо этого следует передавать параметр по ссылке. Это означает, что функ-
ция будет работать именно с той переменной, которая использовалась при вызове
функции, а не с переменной, которая имеет то же значение. Следовательно, лю-
бые изменения переменной, использовавшейся функцией, отразятся на значении
переменной, использовавшейся в качестве параметра. Для этого при описании па-
раметра необходимо воспользоваться ключевым словом ref:
static void showDouble(ref int val)
{
val *= 2;
Console.WriteLine(•val doubled = {0}*, val);
}
Вторично ключевое слово ref необходимо использовать при вызове функции
(это обязательное требование, поскольку тот факт, что параметр описан как ref,
является неотъемлемой частью сигнатуры функции):
int myNumber = 5;
Console.WriteLine('myNumber = {0}*, myNumber);
showDouble(ref myNumber);
Console.WriteLine('myNumber = {0}*, myNumber);
В этом случае на консоль будет выведен следующий текст:
myNumber = 5
val doubled = 10
myNumber =10
Н а ЭТОТ р а з п е р е м е н н а я myNumber б ы л а и з м е н е н а В фуНКЦИИ s h o w D o u b l e ( ) .
Для переменных, используемых в качестве параметров типа ref, имеются два
ограничения. Во-первых, поскольку существует вероятность, что в результате вы-
зова функции значение вызываемого по ссылке параметра будет изменено, то при
вызове функции запрещается использовать переменные типа const. Отсюда
следует, что следующий вызов является недопустимым:
const int myNumber = 5;
Console.WriteLine("mvNumber = {0}*, myNumber);
showDouble(ref myNumber);
Console.WriteLine("myNumber = {0}•, myNumber);
Во-вторых, необходимо использовать заранее инициализированную переменную.
С# не гарантирует, что параметр типа ref будет инициализирован той функцией,
в которой он используется. Следующий код также является недопустимым:
int myNumber;
showDouble(ref myNumber);
Console.WriteLine(*myNumber = {0}*, myNumber);



























Категория: информатика | Просмотров: 1091 | Добавил: basic | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Календарь
«  Февраль 2010  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

krutoto.ucoz.ru
Бесплатный конструктор сайтов - uCoz