Для лучшего понимания механизма работы делегата рассмотрим решение следующей задачи: разработать приложение для вычисления пяти функций вещественного типа, имеющих вещественный аргумент: Sin(x), Log(x), Cos(x), Exp(x) и Round(x). Для выбора вычисляемой функции использовать делегат.
Исходный код программы:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
}
public delegate double Funk(double x);//Объявление делегата
public double rab(Funk f, double x) { return f(x); }
//Объявление функции, используюшей делегат
private void button1_Click(object sender, EventArgs e)
{
string st;
double x, y;
textBox2.Text = "";
x = Convert.ToDouble(textBox1.Text);
st="Значение x=" +textBox1.Text+ "\r\n";
textBox2.AppendText(st);
y = rab(Math.Sin, x); // Применение делегата
st = "Sin(x)=" + y.ToString() + "\r\n";
textBox2.AppendText(st);
y = rab(Math.Log, x); // Применение делегата
st = "Log(x)=" + y.ToString() + "\r\n";
textBox2.AppendText(st);
y = rab(Math.Cos, x); // Применение делегата
st = "Cos(x)=" + y.ToString() + "\r\n";
textBox2.AppendText(st);
|
|
y = rab(Math.Exp, x); // Применение делегата
st = "Exp(x)=" + y.ToString() + "\r\n";
textBox2.AppendText(st);
y = rab(Math.Round, x); // Применение делегата
st = "Round(x)=" + y.ToString() + "\r\n";
textBox2.AppendText(st);
}
}
}
Работа программы изображена на рисунке 13.1.
Рисунок 13.1 – Использование делегата
Естественно можно навести «красоту» в код программы, например,
private void button1_Click(object sender, EventArgs e)
{
string st;
Funk[] ff={Math.Sin, Math.Log, Math.Cos, Math.Exp,Math.Round};
string[] sfu = { "Sin", "Log", "Cos", "Exp", "Round" };
double x, y;
textBox2.Text = "";
x = Convert.ToDouble(textBox1.Text);
st="Значение x=" +textBox1.Text+ "\r\n";
textBox2.AppendText(st);
for (int i = 0; i < 5; i++)
{
y = rab(ff[i], x);
st = sfu[i]+"=" + y.ToString() + "\r\n";
textBox2.AppendText(st);
}
}
Идея объявления и использования делегата в программе полностью рассмотрена в коде программы этого учебного примера.
Еще раз отметим особенность делегатов – динамически (во время выполнения программы) обращаться к вызываемым методам. Эта особенность делегатов часто используется при создании базовых конструкций программ, в которые можно добавлять различные создаваемые фрагменты, например, фрагменты меню, включающие «однотипные» методы.