Корпорация Майкрософт предоставляет 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);
}
