- •Сборка (assembly) и ее структура в .Net технологии. Основные части и их назначение.
- •Последовательность создания и выполнения программ на платформе .Net.
- •Сборка (assembly) и ее структура в .Net технологии. Основные части и их назначение.
- •Последовательность создания и выполнения программ на платформе .Net.
- •Структура программы на языке c#.
- •Описания классов на языке c#.
- •Описание и использование методов класса. Перегрузка методов класса.
- •Основные классы - коллекции. Назначение и использование.
- •Базовый класс System.Object. Назначение, методы.
- •Операции языка c#. Перегрузка операций в создаваемых классах.
- •Описание наследования классов в c#.
- •Интерфейсы. Назначение, описание и использование.
- •Делегаты. Назначение, описание и использование.
- •События классов. Описание событий в классе и их использование в классах пользователях.
- •Класс Form для создания графического интерфейса.
- •Элементы управления. Назначение, основные свойства и методы.
- •Обработка событий от элементов управления формы. Сигнатура. Задание метода – обработчика события. Создание метода – обработчика события.
- •16. Событие перерисовки формы – Paint. Когда возникают, как обрабатывается.
- •Класс Graphics. Назначение и использование. Основные методы рисования.
- •Программирование пользовательских диалогов.
- •Назначение и основные классы технологии ado.Net.
Делегаты. Назначение, описание и использование.
В программе часто требуется хранить и передавать адреса методов.
Функции обратного вызова (callback functions, callbacks).
Используя callbacks можно указать, чтобы одна функция обращалась к другой функции.
С помощью этого подхода разработчики в Win32 могут обрабатывать нажатие клавиш, движение мыши, выбор пунктов меню.
Для реализации обратных вызовов в C# используется новый тип delegate (делегат).
Объекты данного типа могут хранить ссылки на методы с заданной сигнатурой.
Для описания нового типа используется ключевого слова delegate.
Новый тип можно описать с помощью класса:
class xxxx
{...}
И новый тип можно описать с помощью делегата:
delegate <сигнатура>
Сигнатура это
тип возвращаемого значения
последовательность типов передаваемых параметров
Например: int Func (int a, float b) { … }
Тип delegate поддерживает три важных элемента информации:
Адрес метода на который он ссылается.
Параметры (если они есть) данного метода.
Возвращаемое методом значение.
Для описания типа делегата нужно указать ключевое слово delegate после которого задать сигнатуру, которой он должен соответствовать:
<режим доступа> delegate <тип> <имя типа> (формальные параметры);
Например создаем новый тип MyFunc:
public delegate int MyFunc(int n, int m);
После того, как тип delegate описан можно создавать экземпляры данного типа (переменные):
MyFunc f1;
Этим переменным можно присваивать ссылки на методы с заданной сигнатурой:
f1 = new MyFunc(Sum); // для метода Sum(int x, int y);
После задания ссылки на метод этот метод можно вызывать с помощью переменной delegate с помощью операции ().
int n = f1(5,4);
Использование делегатов
Объявление нового типа ссылок с помощью типа delegate:
<режим доступа> delegate <тип> <имя типа> (формальные параметры);
Например: public delegate int MyFunc(int n);
Создание экземпляра нового типа ссылок
<имя типа> <имя переменной> = new <имя типа> (имя функции);
Например:
int myFunction(int k) { return (2*k);} . . . f = new MyFunc (myFunction);
Использование экземпляра делегата (вызов методов, ссылки на которые сохранены)
задание ссылки:
<имя переменной> = new <имя типа> (<имя метода>);
<имя переменной> = <имя метода>;
вызов методов
<имя переменной>(фактические параметры);
Например: int n = f(5);
Будут вызываться последовательно все методы, ссылки на которые сохранены
События классов. Описание событий в классе и их использование в классах пользователях.
События это:
Сообщение объекта своему пользователю о том, что произошло что-то важное.
Например:
Выполнена какая-то часть работы
Произошла ошибка
Пользователь выполнил некоторые действия (переместил мышь, сделал щелчок, нажал клавишу)
Вся работа программ с среде ОС Windows основана на событиях
Программирование основанное на событиях – event driven programming.
Работа с событиями в C#
С помощью делегатов в классах можно описывать события.
События это способ взаимодействия между объектами разных классов.
Объекты одного класса могут использовать объекты других классов.
Для этого они создают объекты требуемого класса и вызывают его методы (передают ему сообщения).
При работе вызванных методов часто возникает необходимость передать сообщения о возникших ситуациях (важных изменения в своей работе) объектам вызывающего класса, без завершения их работы.
Для передачи таких сообщений и используются специальные элементы класса – события.
Объявление события в классе
Вначале объявляется делегат, как это рассматривалось ранее. Объявление делегата описывается в некотором классе. Но, часто, это объявление находится вне класса в пространстве имен.
public delegate <тип> <имя_делегата> ([параметры]);
Например:
public delegate void MyHandler (object o, int n);
Объявить событие как экземпляр соответствующего делегата. При этом используется ключевое слово event (это гарантирует, что экземпляр события не может быть вызван в других классах).
рublic event <имя_делегата> <имя_события>;
Например:
public event MyHandler MyEvent;
Для инициирования события требуется просто вызвать на выполнение экземпляр делегата.
Например:
if (MyEvent != null) // проверка, что для события заданы обработчики
MyEvent(this, i); // если есть обработчики, то запускаем событие
Обработка событий в классах
В классе, который будет обрабатывать событие, нужно:
описать метод - обработчик события, который имеет такую же сигнатуру, как у делегата, который задает событие;
в одном из методов создать объект, имеющий событие;
присвоить ссылку на метод – обработчик события – открытой переменной объекта (событию) с использованием операции +=.
Пример обработки события
class Program {
const int WorkVolume = 10000000; // объем работы
// обработчик события
private static void ShowStar(object o, int n)
{ Console.WriteLine(" Выполнено {0}%", n);
//Console.Write("*"); // можно просто выводить * }
public static void Main()
{ // создается объект
ClassWithEvent obj=new ClassWithEvent(WorkVolume);
// событию задается обработчик
obj.MyEvent += new MyHandler(ShowStar);
// запускам метод объекта у которого возникает данное событие
obj.LongWork();
// ждем нажатия клавиши
Console.ReadLine(); }
}
