|
Программирование >> Программирование с использованием ajax
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 $<общая стоимость>
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |