Лучшая подборка книг и информации по программированию.Скидка 11%, подарки к заказу и бесплатная доставка!
RSS иконка EMail иконка Домашняя иконка

  • Простой пример использования делегатов.

    Написано 02.07.2010 21:11 devalmor Нет комментариев

    Определим класс MathOperations, который имеет пару статических методов для выполнения действий над числами double. Затем используем делегатов для вызова этих методов. Математический класс выглядит следующим образом:

    class MathOperations{
    public static double MultiplyByTwo(double value){
    return value*2;
    }
    public static double Square(double value){
    return value*value;
    }
    }


    Вызываются эти методы так:

    using System;
    namespace Wrox.ProfessionalCSharp.Chepter6.SimpleDelegate {
    delegate double BoubleOp (double x);
    class MainEntryPoint{
    static void Main(scring[] args){
    DoubleOp [] operations =
    {
    new DoubleOp(MathOperations.MultiplyByTwo), new DoubleOp(MathOperations.Square)
    };

    for (int i=0; i < operations.Length; i++){
    Console.WriteLine("Using operations[{0}]:", i);
    ProcessAndDisplayNumber(operations[i], 2.0);
    ProcessAndDisplayNumber(operations[i], 7.94);
    ProcessAndDisplayNumber(operations[i], 1.414);
    Console.WriteLine();
    }
    static void ProcessAndDisplayNumber(DoubleOp action, double value){
    double result = action(value);
    Console.WriteLine("Value is {0}, result of operation is {1}", value, result);
    }
    }
    }
    }

    В этом коде мы создаем массив делегатов DoubleOp. (Напомним, что, определив класс делегата, мы можем создавать его экземпляры точно так же. как и для обычных классов, поэтому их помещение в массив не является проблемой.) Каждый элемент массива инициализируется ссылкой на отдельные операции, реализованные в классе MathOperations. Затем мы в цикле проходим по массиву, применяя каждую операцию к трем отдельным значениям. Этим мы показываем один из способов применения делегатов: их можно группировать в массив, а несколько методов можно вызывать в цикле.
    Ключевыми в этом коде являются строки, где мы передаем каждого делегата в метод ProcessAndDispiayNumber(). например:

    ProcessAndDispiayNumber(operations[i], 2.0) ;

    Здесь передается имя делегата, но без параметров. При условии, что operations[I] является делегатом, синтаксически:
    “operations[i] ” означает “делегат”, т.е. метод, представляемый делегатом “operations[i] (2.0) ” означает “вызвать этот метод”
    Метод ProcessAndDispiayNumber() принимает делегата в качестве своего первого параметра:

    static void ProcessAndDisplayNuinbev(DoubleOp action, double value)

    Затем, находясь внутри этого метода, мы вызываем:

    double Result = action(value);

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


    Оставить комментарий

    Вы должны авторизоваться для отправки комментария.