- •Предисловие
- •1 Среда визуального программирования visual studio.Net
- •1.1 Введение в объектно - ориентированное программирование
- •1.2 Понятие о событийном управлении Windows
- •1.3 Основные окна среды Visual Studio.Net
- •1.4 Основные структурные элементы разработки проекта c#
- •1.5 Пример первой учебной программы
- •2.1 Технология визуального проектирования форм
- •1.6 Вопросы для самопроверки
- •2 Элементы управления
- •2.2 Элементы управления панели Toolbox
- •2.3 Пример использования элементов управления
- •2.4 Вопросы для самопроверки
- •3 Графический интерфейс языка c#
- •3.1 Пространство имен System.Drawing
- •3.2 Класс Graphics
- •3.3 Пример программной реализации
- •3.4 Вопросы для самопроверки
- •4 Использование меню в приложении
- •4.1 Меню программы
- •4.2 Создание инструментальной панели приложения
- •4.3.Вопросы для самопроверки
- •5 Использование диалоговых меню
- •5.1 Обработчики событий для работы с матрицей
- •5.2 Обработчик событий для открытия файла
- •5.3 Обработчик событий для записи в файл
- •5.4 Обработчик событий для работы с текстом
- •5.5 Вопросы для самопроверки
- •6 Многооконные приложения
- •6.1 Создание «кнопочной» главной формы
- •6.2 Добавление новых форм приложения
- •6.3 Обработчики событий главной формы
- •6.4 Табличная форма представления и редактирования значений
- •6.5 Графическая форма представления прямоугольников
- •6.6 Вопросы для самопроверки
- •7. Понятие класса
- •7.1 Понятие класса
- •7.2 Состав класса
- •7.3 Методы класса
- •7.4 Структура объекта
- •7.5 Пример учебной программы
- •7.6 Доступ к полям
- •7.7 Вопросы для самопроверки
- •1 Понятие класса?
- •8 Элементы классов
- •8.1 Конструкторы
- •8.2 Деструкторы
- •8.3 Свойства
- •8.4 Параметр по ссылке this
- •8.5 События класса
- •8.6 Перегрузка операций класса
- •8.7 Вопросы для самопроверки
- •9 Принципы ооп
- •9.1 Понятие инкапсуляции
- •9.2 Понятие наследования
- •9.3 Вопросы для самопроверки
- •10 Принцип полиморфизма
- •10.1 Понятие полиморфизма
- •10.2 Пример статического наследования методов
- •10.3 Пример динамического наследования методов
- •10.4 Вопросы для самопроверки
- •11 Использование интерфейсов
- •11.1 Понятие интерфейса
- •11.2 Синтаксис интерфейса
- •11.3 Использование стандартного интерфейса iEnumerable
- •11.4 Вопросы для самопроверки
- •12 Композиция и коллекция классов
- •12.1 Понятие композиции и коллекции класса
- •12.2 Пример использования композиции и коллекции класса
- •12.3 Некоторые коллекции Framework
- •12.4 Коллекция ArrayList
- •12.5 Вопросы для самопроверки
- •13 Делегаты
- •13.1 Понятие делегата
- •13.2 Описание делегата
- •13.3 Пример использования делегата
- •13.4 Совместимость делегатов
- •13.5 Методы базовых классов делегатов
- •13.6 Вопросы для самопроверки
- •14 События
- •14.1 Понятие события
- •14.2 Некоторые часто используемые события среды Visual Studio.Net
- •14.3 Пример использования стандартных событий классов
- •14.4 Нестандартные события классов
- •14.5 Вопросы для самопроверки
- •Приложение а Ответы на вопросы для самопроверки
- •1 Понятие класса?
- •Предметный указатель
- •Список литературы
13.3 Пример использования делегата
Для лучшего понимания механизма работы делегата рассмотрим решение следующей задачи: разработать приложение для вычисления пяти функций вещественного типа, имеющих вещественный аргумент: 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);
}
}
Идея объявления и использования делегата в программе полностью рассмотрена в коде программы этого учебного примера.
Еще раз отметим особенность делегатов – динамически (во время выполнения программы) обращаться к вызываемым методам. Эта особенность делегатов часто используется при создании базовых конструкций программ, в которые можно добавлять различные создаваемые фрагменты, например, фрагменты меню, включающие «однотипные» методы.
13.4 Совместимость делегатов
Рассматривая «совместимость» делегатов необходимо рассмотреть два вопроса – совместимость типов делегатов и совместимость экземпляров объектов делегатов.
Типы делегатов всегда несовместимы друг с другом, даже если их форматы записей совпадают, например,
public delegate void Funk1();
public delegate void Funk2();
. . .
Funk1 d1 = Metod1;
Funk2 d2 = d1; //Ошибка о несовместимости типов
Если для объявления делегатов использован один и тот же тип, то имеет смысл говорить о совместимости (равенстве) экземпляров делегатов. Экземпляры однотипных делегатов считаются равными, если они получают ссылку на один и тот же метод, например,
public delegate void Funk1();
. . .
Funk1 d1 = Metod1;
Funk1 d2 = Metod1;
В данном примере можно говорить о равенстве экземпляров делегатов d1 и d2.
