Корпорация Майкрософт предоставляет 2 встроенных делегатов для работы.
public delegate void EventHandler(object sender, EventArgs e);
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
Эти встроенные делегаты помогают вам легко писать код обработки событий. С помощью этих делегатов можно передать одно или несколько значений обработчику событий. Когда вы создаете событие, вы должны следовать типизации и передать необходимые параметры делегатам.
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#.
Объявил встроенный делегат
public event EventHandler<EventArgs> ev_OddNumber;
Вызываем событие
ev_OddNumber(this, EventArgs.Empty);
this
обозначает текущий экземпляр класса EventArgs.Empty
говорит, что есть пустое значение в параметре.
Инициализация событий в главной функции
a.ev_OddNumber += EventMessage;
Вызывает методы с требуемыми параметрами.
static void EventMessage(object sender, EventArgs e)
{
Console.WriteLine("***Event Executed : This is Odd Number***");
}
В приведенной выше программе события не возвращают никакого значения. Теперь рассмотрим следующую измененную программу, которая возвращает значение с помощью EventArgs.
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.
public class OddNumberEventArgs : EventArgs
{
public OddNumberEventArgs(int result)
{
sum = result;
}
public int sum { get; set; }
}
2. Теперь, созданное событиеev_OddNumber
, используя этот класс.
public event EventHandler<OddNumberEventArgs> ev_OddNumber;
3. Передайте обязательный параметр при вызове этого события.
ev_OddNumber(this, new OddNumberEventArgs(result)); //Raised Event
4. Теперь в EventMessage()
функции; OddNumberEventArgs e
имеет значение.
static void EventMessage(object sender, OddNumberEventArgs e)
{
Console.WriteLine("Event Executed : {0} is an Odd Number", e.sum);
}