Программирование >>  Программирование с использованием ajax 

1 ... 47 48 49 [ 50 ] 51 52 53 ... 396


3. Запустите приложение. На рис. 6.10 показан результат, который должен получиться.


Рис, 6.10, Приложение Ch06Ex05 в действии

Описание полученных результатов

в приведенном коде определяется делегат (по имени ProcessDelegate), возвращаемый тип и параметры которого соответствуют тем, что имеются у двух функций (Multiply () и Divide ()). Определение этого делегата выглядит следующим образом:

delegate double ProcessDelegate (double paraml, double param2);

Ключевое слово delegate указывает, что данное определение предназначено для делегата, а не для функции (поскольку это определение расположено в том же месте, в котором могло бы находиться определение функции). Далее в определении указывается возвращаемый тип double и два параметра double. Использованные имена были выбраны произвольно; типам и параметрам делегатов можно давать любые имена. В частности, в данном коде для делегата было выбрано имя ProcessDelegate, а для двух параметров типа double - соответственно, paraml и param2.

Код в Main О начинается с объявления переменной с использованием нового типа делегата:

static void Main(string [ ] args) {

ProcessDelegate process;

Далее идет довольно стандартный код на С#, который сначала запрашивает два разделенных запятой числа и затем помещает их в две переменные double:

Console.WriteLine( Enter 2 numbers separated with a comma: ); string input = Console.ReadLine();

int commaPos = input.IndexOf(,);

double paraml = Convert.ToDouble(input.Substring (0, commaPos)); double param2 = Convert.ToDouble(input.Substring(commaPos + 1,

input.Length - commaPos - 1));

В демонстрационных целях в этот код не была включена операция проверки правильности вводимых пользоват£Л£м данных. В реальном коде обязат£льно это было обязат£льно предусмотрено.

Далее пользователю предлагается перемножить или поделить эти числа:

Console.WriteLine( Enter М to multiply or D to divide: ); input = Console.ReadLine0;

После этого, в зависимости от выбора, инициализируется переменная делегата process:

if (input == М )

process = new ProcessDelegate(Multiply); else

process = new ProcessDelegate(Divide);



Для присваивания переменной делегата ссылки на функцию применяется несколько необычный синтаксис. Во многом так же, как и при присваивании значений массивам, при создании нового делегата требуется использовать ключевое слово new. После new указывается тип делегата и предоставляется параметр, ссылающийся на функцию, которая должна использоваться, каковой в данном случае является Multiply () или Divide О . Этот параметр не соответствует ни параметрам типа делегата, ни параметрам целевой функции; этот синтаксис применяется исключительно для делегатов. На его месте указывается просто имя применяемой функции, безо всяких круглых скобок.

И, наконец, напоследок выполняется вызов выбранной функции с использованием делегата. Здесь применяется тот же самый синтаксис, независимо от того, на какую из функций ссылается делегат:

Console.WriteLine( Result: {0} , process(paraml, param2)); Console.ReadKey0;

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

static void ExecuteFunction(ProcessDelegate process) {

process(2.2, 3.3);

Это означает, что поведением функций можно управлять передачей им делегатов, во многом подобно выбору наиболее подходящей для использования оснастки . Например, может существовать функция, сортирующая массивы строк в алфавитном порядке. Для сортировки списков могут применяться разнообразные алгоритмы с разной производительностью, что зависит от характеристик сортируемого списка. За счет применения делегатов можно выбирать используемый алгоритм, передавая функции сортировки делегат алгоритма сортировки.

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

Резюме

В этой главе был предоставлен довольно подробный обзор способов применения функций в коде С#. Многие из дополнительных возможностей, которые предлагают функции (вроде делегатов, например), являются более абстрактными и требуют анализа с точки зрения объектно-ориентированного программирования, который будет проводиться в главе 8.

Далее перечислены ключевые моменты, с которыми вы ознакомились в этой главе.

□ Определение и использование функций в консольных приложениях.

□ Обмен данными с функциями через возвращаемые значения и параметры.

□ Передача массивов параметров функциям.

□ Передача по ссылке и по значению.

□ Указание параметров для дополнительных возвращаемых значений.

□ Концепция области видимости переменных, благодаря которой переменные могут скрываться от тех разделов кода, в которых они не нужны.



□ Детали применения функции Main () и параметров командной строки в ней. а Использование функций в структурах.

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

□ Делегаты и как с их помощью обеспечивать динамический выбор функций во время выполнения.

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

Упражнения

1. Две приведенных ниже функции содержат ошибки. Назовите их.

static bool Write О {

Console.WriteLine( Text output from function. );

static void myFunction(string label, params int[] args, bool showLabel) {

if (showLabel)

Console.WriteLine(label); foreach (int i in args)

Console.WriteLine ( {0 } , i);

2. Напишите приложение, использующее два аргумента командной строки для помещения значений, соответственно, в строку и в целочисленную переменную, а затем отображающее эти значения на экране.

3. Создайте делегат и используйте его для выполнения роли функции Console. ReadLine () при запрашивании у пользователя входных данных.

4. Измените приведенную ниже структуру так, чтобы она включала функцию, возвращающую общую цену заказа:

struct order {

public string itemName; public int unitCount; public double unitCost;

5. Добавьте в структуру order еще одну функцию, возвращающую форматированную строку, как показано ниже (с заменой всех выделенных курсивом вхождений в угловых скобках соответствующими значениями):

Order Information: <количество единиц> <наименование элемента> items at %<стоимость единицы> each, total cost $<общая стоимость>



1 ... 47 48 49 [ 50 ] 51 52 53 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика