|
Программирование >> Обработка исключительных ситуаций
I -2.000 I -0,909 I I -1.000 I -0,841 j I 0.000 I 0,000 j I 1,000 I 0.841 I I 2,000 j 0,909 I Таблица функции Simple -X-Y- I 0,000 I 1,000 I I 1.000 I 1,000 I I 2,000 I 1,000 j I 3,000 I 1.000 I В среде Visual Studio 2005, использующей версию 2.0 языка C#, можно применять упрощенный синтаксис для делегатов. Первое упрощение заключается в том, что в большинстве случаев явным образом создавать экземпляр делегата не требуется, поскольку он создается автоматически по контексту. Второе упрощение заключается в возможности создания так называемых анонимных методов - фрагментов кода, описываемых непосредственно в том месте, где используется делегат. В листинге 10.4 использованы оба упрощения для реализации тех же действий, что и листинге 10.3. Листинг 10.4. Передача делегата через список параметров (версия 2.0) using System; namespace ConsoleAppl icationi { public delegate double FunC double x ); объявление делегата class Classl public static void TableC Fun F. double x, double b ) Console.WriteLine( -X-Y- ): while ( x <= b ) Листинг 10.3 (продолжение) Tablet new Fun( Math.Sin ), -2, 2 ); Console.WriteLineC Таблица функции Simple ); TableC new Fun( Simple ), 0. 3 ); Результат работы программы: Таблица функции Sin -X-Y- Console.WriteLineC {0.8:0.000} {1,8:0.000} , x. FCx)): x += 1; Console.WriteLineC static void MainO Console.WriteLineC Таблица функции Sin TableC Math.Sin. -2. 2 ); упрощение 1 Console.WriteLineC Таблица функции Simple ); TableC delegate (double x ){ return 1: }, 0. 3 ); упрощение 2 В первом случае экземпляр делегата, соответствующего функции Sin, создается автоматически . Чтобы это могло произойти, список параметров и тип возвращаемого значения функции должны быть совместимы с делегатом. Во втором случае не требуется оформлять простой фрагмент кода в виде отдельной функции Simple, как это было сделано в предыдущем листинге, - код функции оформляется как анонимный метод и встраивается прямо в место передачи. Альтернативой использованию делегатов в качестве параметров являются виртуальные метод1. Универсальный метод в1вода таблицы значений функции можно реализовать с помощью абстрактного базового класса, содержащего два метода: метод вывода таблицы и абстрактный метод, задающий вид вычисляемой функции. Для вывода таблицы конкретной функции необходимо создать производный класс, переопределяющий этот абстрактный метод. Реализация метода вывода таблицы с помощью наследования и виртуальных методов приведена в листинге 10.5. Листинг 10.5. Альтернатива параметрам-делегатам using System; namespace ConsoleAppli cationl { abstract class TableFun { public abstract double F( double x ); public void TableC double x, double b ) Console.WriteLineC while ( x <= b ) продолжение В результате в 2005 году яз1к С# в этой части вплотную приблизился к синтаксису старого доброго Паскаля, в котором передача функций в качестве параметров была реализована еще в 1992 году, если не раньше. & Листинг 10.5 (продолжение) Console.WriteLineC {0.8:0.000} х += 1; Console.WriteLineC - {1.8:0.000} . х, FCx)); class SimpleFun : TableFun public override double F( double x ) return 1; class SinFun : TableFun public override double F( double x ) return Math.Sin(x); class Classl static void MainO \ TableFun a = new SinFunO: Console.WriteLineC Таблица функции Sin ); a.TableC -2. 2 ): a = new SimpleFunO; Console.WriteLineC Таблица функции Simple ): a.TableC 0, 3 ); Результат работы этой программы такой же, как и пред1дущей, но, на мой взгляд, в данном случае применение делегатов предпочтительнее. Обработка исключений при вызове делегатов Ранее говорилось о том, что если в одном из методов списка делегата генерируется исключение, следующие методы не вызываются. Этого можно избежать, если обеспечить явный перебор всех методов в проверяемом блоке и обрабатывать возникающие исключения. Все методы, заданные в экземпляре делегата, можно
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |