Корпорация Майкрософт предоставляет 2 встроенных делегатов для работы.
1 2 |
public delegate void EventHandler(object sender, EventArgs e); public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e); |
Эти встроенные делегаты помогают вам легко писать код обработки событий. С помощью этих делегатов можно передать одно или несколько значений обработчику событий. Когда вы создаете событие, вы должны следовать типизации и передать необходимые параметры делегатам.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace event_programming { //This is Subscriber Class class Program { static void Main(string[] args) { AddTwoNumbers a = new AddTwoNumbers(); //Event gets binded with delegates a.ev_OddNumber += EventMessage; a.Add(); Console.Read(); } //Delegates calls this method when event raised. static void EventMessage(object sender, EventArgs e) { Console.WriteLine("***Event Executed : This is Odd Number***"); } } //This is Publisher Class class AddTwoNumbers { public event EventHandler<EventArgs> ev_OddNumber; public void Add() { int result; result = 5 + 4; Console.WriteLine(result.ToString()); //Check if result is odd number then raise event if((result % 2 != 0) && (ev_OddNumber != null)) { ev_OddNumber(this, EventArgs.Empty); //Raised Event } } } } |
В этой программе я использовал встроенные делегаты в c#.
Объявил встроенный делегат
1 |
public event EventHandler<EventArgs> ev_OddNumber; |
Вызываем событие
1 |
ev_OddNumber(this, EventArgs.Empty); |
this
обозначает текущий экземпляр класса EventArgs.Empty
говорит, что есть пустое значение в параметре.
Инициализация событий в главной функции
1 |
a.ev_OddNumber += EventMessage; |
Вызывает методы с требуемыми параметрами.
1 2 3 4 |
static void EventMessage(object sender, EventArgs e) { Console.WriteLine("***Event Executed : This is Odd Number***"); } |
В приведенной выше программе события не возвращают никакого значения. Теперь рассмотрим следующую измененную программу, которая возвращает значение с помощью EventArgs.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace event_programming { class Program { static void Main(string[] args) { AddTwoNumbers a = new AddTwoNumbers(); a.ev_OddNumber += EventMessage; a.Add(); Console.Read(); } static void EventMessage(object sender, OddNumberEventArgs e) { Console.WriteLine("Event Executed : {0} is an Odd Number", e.sum); } } public class AddTwoNumbers { public event EventHandler<OddNumberEventArgs> ev_OddNumber; public void Add() { int result; result = 5 + 4; Console.WriteLine(result.ToString()); if((result % 2 != 0) && (ev_OddNumber != null)) { ev_OddNumber(this, new OddNumberEventArgs(result)); //Raised Event } } } //Creating Custom EventArgs public class OddNumberEventArgs : EventArgs { public OddNumberEventArgs(int result) { sum = result; } public int sum { get; set; } } } |
Давайте разберемся в этом примере.
- Я создал пользовательский класс OddNumberEventArgs, который наследует EventArgs. Этот класс просто устанавливает значение параметра в переменную sum.
1 2 3 4 5 6 7 8 |
public class OddNumberEventArgs : EventArgs { public OddNumberEventArgs(int result) { sum = result; } public int sum { get; set; } } |
2. Теперь, созданное событиеev_OddNumber
, используя этот класс.
1 |
public event EventHandler<OddNumberEventArgs> ev_OddNumber; |
3. Передайте обязательный параметр при вызове этого события.
1 |
ev_OddNumber(this, new OddNumberEventArgs(result)); //Raised Event |
4. Теперь в EventMessage()
функции; OddNumberEventArgs e
имеет значение.
1 2 3 4 |
static void EventMessage(object sender, OddNumberEventArgs e) { Console.WriteLine("Event Executed : {0} is an Odd Number", e.sum); } |