Этот метод вызывается для запуска события,



public void OnSomeEvent(int n) {

if(SomeEvent != null)

SomeEvent(n);

}

}

 

class LambdaEventDemo {

static void Main() {

MyEvent evt = new MyEvent();

Использовать лямбда-выражение в качестве обработчика событий,

evt.SomeEvent += (n) =>

Console.WriteLine("Событие получено. Значение равно " + n);

 

Запустить событие,

evt.OnSomeEvent(1);

evt.OnSomeEvent(2);

}

}

 

Вот к какому результату приводит выполнение этой программы.

 

Событие получено. Значение равно 1

Событие получено. Значение равно 2

 

Обратите особое внимание на то, как в этой программе лямбда-выражение используется в качестве обработчика событий.

 

evt.SomeEvent += (n) =>

Console.WriteLine("Событие получено. Значение равно " + n);

 

Синтаксис для использования лямбда-выражения в качестве обработчика событий остается таким же, как для его применения вместе с любым другим типом делегата.

Несмотря на то что при создании анонимной функции предпочтение следует теперь отдавать лямбда-выражениям, в качестве обработчика событий можно по-прежнему использовать анонимный метод. Ниже приведен вариант обработчика событий из предыдущего примера, измененный с целью продемонстрировать применение анонимного метода.

 

// Использовать анонимный метод в качестве обработчика событий,

evt.SomeEvent += delegate(int n) {

Console.WriteLine("Событие получено. Значение равно " + n);

};

 

Как видите, синтаксис использования анонимного метода в качестве обработчика событий остается таким же, как и для его применения вместе с любым другим типом делегата.

 

 

Рекомендации по обработке событий в среде .NET Framework

 

В C# разрешается формировать какие угодно разновидности событий. Но ради совместимости программных компонентов со средой .NET Framework следует придерживаться рекомендаций, установленных для этой цели корпорацией Microsoft. Эти рекомендации, по существу, сводятся к следующему требованию: у обработчиков событий должны быть два параметра. Первый из них — ссылка на объект, формирующий событие, второй — параметр типа EventArgs, содержащий любую дополнительную информацию о событии, которая требуется обработчику. Таким образом, .NET-совместимые обработчики событий должны иметь следующую общую форму.

 

void обработчик(object отправитель, EventArgs е) {

// ...

}

 

Как правило, отправитель — это параметр, передаваемый вызывающим кодом с помощью ключевого слова this. А параметр е типа EventArgs содержит дополнительную информацию о событии и может быть проигнорирован, если он не нужен.

Сам класс EventArgs не содержит поля, которые могут быть использованы для передачи дополнительных данных обработчику. Напротив, EventArgs служит в качестве базового класса, от которого получается производный класс, содержащий все необходимые поля. Тем не менее в классе EventArgs имеется одно поле Empty типа static, которое представляет собой объект типа EventArgs без данных.

Ниже приведен пример программы, в которой формируется .NET-совместимое событие.

 

// Пример формирования .NET-совместимого события,  

using System;  

// Объявить класс, производный от класса EventArgs.  

class MyEventArgs : EventArgs {  

public int EventNum;  

}  

 

// Объявить тип делегата для события.  

delegate void MyEventHandler(object source, MyEventArgs arg);  

 

// Объявить класс, содержащий событие,  

class MyEvent {  

static int count = 0;  

public event MyEventHandler SomeEvent;  

 

// Этот метод запускает событие SomeEvent.  

public void OnSomeEvent() {  

MyEventArgs arg = new MyEventArgs();  

if(SomeEvent != null) {  

arg.EventNum = count++;  

SomeEvent(this, arg);  

}  

}  

}  

 

class X {  

public void Handler(object source, MyEventArgs arg){  

Console.WriteLine("Событие " + arg.EventNum +  

" получено объектом класса X.");  

Console.WriteLine("Источник: " + source);  

Console.WriteLine();  

}  

}  

 

class Y {  

public void Handler(object source, MyEventArgs arg){  

Console.WriteLine("Событие " + arg.EventNum +  

" получено объектом класса Y.");  

Console.WriteLine("Источник: " + source);  

Console.WriteLine() ;  

}  

}  

 

class EventDemo6 {  

static void Main() {  

X ob1 = new X();  

Y ob2 = new Y();  

MyEvent evt = new MyEvent();  

 

// Добавить обработчик Handler() в цепочку событий,  

evt.SomeEvent += ob1. Handler;  

evt.SomeEvent += ob2.Handler;  

 

// Запустить событие,  

evt.OnSomeEvent();  

evt.OnSomeEvent();  

}  

}  

 

Ниже приведен результат выполнения этой программы.

 


Дата добавления: 2019-02-12; просмотров: 259; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!