Программирование >>  Обработка исключительных ситуаций 

1 ... 72 73 74 [ 75 ] 76 77 78 ... 142


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дущей, но, на мой взгляд, в данном случае применение делегатов предпочтительнее.

Обработка исключений при вызове делегатов

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



1 ... 72 73 74 [ 75 ] 76 77 78 ... 142

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