Вторник, 19.03.2024, 10:04
Приветствую Вас Гость | RSS

Лекции

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

Главная » 2010 » Февраль » 11 » Функции
00:16
Функции
Функции
Все программы, с которыми мы работали до сих пор, имели форму единого
блока, в ряде случаев включавшем циклы, позволяющие многократно выполнять
отдельные строки кода, и ветвление, позволяющее выполнять некоторые операто-
ры по условию. Если возникала необходимость выполнить какую-либо операцию
над данными, то нужный код должен был находиться там, где он будет работать.
Однако оказывается, что такая структура кода весьма ограниченна. Довольно
часто возникают ситуации, когда выполнение определенных задач — например, по-
иск максимального элемента массива — необходимо в различных местах програм-
мы. Конечно, можно размещать идентичные (или почти идентичные) участки кода
в разных частях приложения каждый раз, когда в этом возникает необходимость,
однако такой подход имеет свои недостатки. Изменение даже одной небольшой де-
тали, касающейся выполнения общей задачи (например, исправление некоторой
ошибки), потребует внесения изменений во многих местах, возможно, разбросан-
ных по всему приложению, а размер таких приложений бывает очень большим.
Пропуск одного места может привести к непоправимым последствиям и неверному
использованию всего приложения.
Решением такого рода проблем является применение функций. Функции в С# —
это средство, позволяющее выполнять некоторые участки кода в произвольном месте
приложения.
Функции особого типа, которые мы будем рассматривать
в настоящей главе, известны под названием методов.
Однако при программировании в среде .NET этот термин
имеет особое значение, которое станет понятным
по мере изучения этой книги, поэтому на данный момент
мы будем избегать его использования.
Например, мы можем написать функцию, которая осуществляет поиск макси-
мального элемента массива. В результате появится возможность использовать эту
функцию из произвольной точки программы, причем в каждом случае будут выпол-
няться одни и те же строки кода. Поскольку мы должны написать этот код только
один раз, то изменения, которые потребуется в него внести, повлияют на все вы-
числения, где бы этот код ни использовался. Такую функцию можно представить
себе как повторно используемый код.
Функции также обладают тем преимуществом, что они позволяют делать про-
грамму более удобочитаемой, и мы получаем возможность группировать вместе
логически связанные между собой части программ. Поступая таким образом, мож-
но сделать тело самого приложения небольшим, поскольку решение внутренних
106 Глава 6
задач приложения будет осуществляться отдельно. Это напоминает способ, посред-
ством которого в VS можно соединять различные участки кода, используя режим
схематического просмотра программ (outline view), что позволяет придать прило-
жению более логичную структуру.
Функции могут также использоваться для создания многоцелевых программ,
которые выполняют одни и те же операции над различными данными. Мы имеем
возможность передавать функциям информацию, с которой они должны работать,
в виде параметров и получать результаты работы функции в виде возвращаемых
значений. В приведенном выше примере можно передать функции в качестве па-
раметра массив, в котором осуществляется поиск, и получить элемент массива
с максимальным значением в качестве возвращаемого значения. Отсюда следует,
что мы можем каждый раз использовать одну и ту же функцию для работы с раз-
личными массивами. Параметры и возвращаемое значение функции вместе назы-
ваются сигнатурой функции.
В настоящей главе мы начнем с того, что рассмотрим способы описания и ис-
пользования простых функций, которые не получают и не возвращают никаких
значений. После этого мы перейдем к способам передачи и получения информации
от функций.
Затем мы обратимся к области действия переменных. Каким образом данные
приложения на С# локализуются в различных участках кода — этот вопрос оказы-
вается особенно важным, когда программа разбивается на множество отдельных
функций.
После этого мы перейдем к подробному рассмотрению функции, играющей зна-
чительную роль в приложениях на С # ,— к функции Main о . Вы узнаете, каким об-
разом можно применять встроенные в нее алгоритмы для использования
аргументов командной строки, которая позволяет передавать информацию прило-
жениям в процессе их запуска.
Далее вы познакомитесь с некоторыми дополнительными возможностями
структур, о которых шла речь в предыдущей главе, а именно с использованием
функций в качестве полей структур.
В заключение главы мы сосредоточимся на двух более сложных темах: на пере-
грузке функций и на делегатах. Перегрузка функций — это способ, позволяющий
иметь несколько функций с одинаковым именем, но с отличающимися сигнатура-
ми. Делегат — тип переменной, который допускает непрямое использование функ-
ции. Один и тот же делегат может быть использован для вызова любой функции,
имеющей указанную сигнатуру, что позволяет осуществлять выбор из нескольких
различных функций в процессе выполнения.
Описание и использование функций
В данном разделе рассказывается, каким образом можно включать функции
в состав приложений, а затем использовать (вызывать) их из кода. Сначала будут
рассмотрены простые функции, не обменивающиеся данными с вызывающим их
кодом, а затем мы перейдем к более сложному использованию функций.
Итак, давайте сразу начнем с примера.
Практикум: описание и использование простой функции
1. Создайте новое консольное приложение с именем ch06Ex0i
В директории C:\BegCSharp\Chapter6.
Функции 107
2. Добавьте следующий код в ciassi.cs:
class Classl
{ ^
static void Write()
{
Console.WriteLine(*Text output from function.*)
}
static void Main (string [] args)
{
Write();
3. Запустите программу:
Ei C:\BegCSharp\Chaptei6\
Text.output from function»
Pi*ess шу kejy to continue
работает
Следующие четыре строки кода описывают простую функцию с именем write о :
static void Write()
{
Console.WriteLine("Text output from function.");
Код, содержащийся в данной функции, просто выводит некоторый текст в кон-
сольном окне. Однако это не столь важно, поскольку в настоящий момент нас
в большей степени интересуют механизмы, лежащие в основе описания и исполь-
зования функции.
В данном случае описание функции состоит из:
• Двух ключевых слов: s t a t i c и void
• Имени функции, за которым располагаются параметры: write о
• Участка выполняемого кода, заключенного в фигурные скобки
Код, который используется для описания функции write о , выглядит почти так
же, как и код самого приложения:
static void Main(string[] args)
Это объясняется тем, что весь код, который мы создавали до сих пор (не считая
описания типов), представляет собой часть некоторой функции. Эта функция —
Main о — выполняет (как упоминалось в главе 3) функцию точки входа в консоль-
ное приложение. Когда запускается приложение, написанное на С#, то происходит
вызов содержащейся в нем функции точки входа, а когда эта функция заканчивает
свою работу, выполнение приложения прерывается. Любой выполняемый код,
написанный на С#, должен иметь точку входа.
__ Глава 6
Единственное отличие между функцией Main о и функцией write о (не считая
тех строк кода, которые в них содержатся) заключается в том, что в круглых скоб-
ках, расположенных за именем функции Main, находится некоторый код. Этот код
служит для задания параметров; к более подробному его обсуждению мы вернемся
несколько позже.
Как уже упоминалось ранее, обе функции — и MainO, и write о — описыва-
ются с использованием ключевых слов s t a t i c (статический) и void (отсутствует).
Ключевое слово s t a t i c имеет отношение к понятиям объектно-ориентированного
программирования, к его рассмотрению мы перейдем ниже. На данном этапе от вас
требуется запомнить только то, что все функции, которые будут задействованы
в приложениях данного раздела, обязательно должны использовать это ключе-
вое слово.
Ключевое слово void, напротив, объяснить очень просто. Оно указывает, что
функция не возвращает никакого значения. Далее в этой главе будет рассказано,
что необходимо писать в тех случаях, когда у функции имеется возвращаемое зна-
чение.
Продолжая рассматривать наше приложение, мы обнаруживаем код, который
осуществляет вызов функции:
WriteO;
Он состоит из имени функции, за которым помещаются пустые круглые скобки.
Когда выполнение программы достигнет этой точки, начнет выполняться код, со-
держащийся В фуНКЦИИ Write().
Обратите внимание, что использование круглых скобок
как при описании функции, так и при ее вызове является
обязательным. Можете попробовать их убрать —
код не пройдет компиляцию.
Возвращаемые значения
Самый простой способ обмена данными с функциями — использование возвра-
щаемого значения. Функции, в которых применяются возвращаемые значения,
точно так же обладают численным значением, как и любые переменные, использу-
емые при вычислении выражений. Аналогично переменным возвращаемые значе-
ния обладают типом.
Например, можно описать функцию с именем getstringO, возвращаемое зна-
чение которой будет иметь тип string, и использовать ее в своей программе:
string = myString;
myString = getStringO;
С другой стороны, можно описать функцию с именем getvaio, которая будет воз-
вращать значение типа double, и использовать ее в математическом выражении:
double myVal;
double multiplier = 5.3;
myVal = getVaK) * multiplier;
Если функция должна обладать возвращаемым значением, то необходимо внес-
ти два изменения:
• В описании функции вместо ключевого слова void указать
тип возвращаемого значения.
• По завершении всех вычислений в функции использовать
ключевое слово return и передать возвращаемое значение
вызывающему коду.
Функции ' 109
Синтаксис кода для рассматриваемого типа функций консольного приложения
будет выглядеть следующим образом:
static <возвращаемыйТип> <имяФункции>()
{
• •:-\\УМ'-\ •.:.'• :•••'• • • • .. :
Единственным ограничением в данном случае является требование, гласящее,
ЧТО <возвращаемоеЗначение> ДОЛЖНО иметь ТИП <возвращаемыйТип> ИЛИ ж е должна
существовать возможность его неявного преобразования в этот тип. Вообще гово-
ря, <возвращаемыйтип> может быть любым, включая самые сложные типы из числа
рассмотренных ранее.
В простейшем случае это может выглядеть следующим образом:
static double getVal() • :
I l l f : :
return 3.2;
Однако в реальной жизни возвращаемые значения обычно являются продуктом
выполняемых функцией некоторых вычислений, поскольку того же результата
можно достигнуть простым использованием переменной типа const.
Когда при выполнении программы достигается оператор return, управление не-
медленно передается обратно в вызывающий код. Никакие строки кода после этого
оператора выполняться не будут. Отсюда, однако, совершенно не следует, что в теле
функции оператор return обязательно должен быть последним. Он может быть
использован и раньше, например, при ветвлении по какому-либо условию. Вклю-
чение оператора return в цикл for, в блок if или в какую-нибудь другую струк-
туру приведет к немедленному окончанию выполнения как этой структуры, так
и всей функции в целом. Например:
static double getValO
{
double checkVal;
// присваивание переменной checkVal некоторого значения,
// полученного в результате некоторых вычислений.
if (checkVal < 5)
r e t u r n 4 . 7 ; • . ' :.
return 3.2;
}
В данном случае будет возвращено одно из двух значений — в зависимости от
значения переменной checkVal.
Имеется единственное ограничение: оператор return должен выполняться до того,
как будет достигнута закрывающая фигурная скобка } данной функции. Следующий
код не является допустимым:
static double getVal()
{
double checkVal;
// присваивание переменной checkVal значения,
// полученного в результате некоторых вычислений.
if (checkVal < 5)
return 4.7;
110 Глава 6
Если checkval >= 5, то не встретится ни одного оператора return, а это запре-
щено. Все ветви должны оканчиваться этим оператором.
И последнее замечание: оператор return может применяться в функциях, объ-
явленных с использованием ключевого слова void (у них отсутствует какое-либо
возвращаемое значение). В таких случаях функция просто прекращает работу. По-
этому при использовании оператора return будет ошибкой размещать возвращае-
мое значение между ключевым словом return и следующей за ним точкой
с запятой.


























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

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

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