| Клуб программистов Лучшая подборка книг и информации по программированию. |
-
Простой пример использования делегатов.
Написано 02.07.2010 21:11 Нет комментариевОпределим класс 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.



Новые комментарии