EventHandler
Тип EventHandler соответствует методу
void Handler(object sender, EventArgs e).
Обобщённый EventHandler<TEventArgs>
принимает наследника EventArgs во
втором параметре. На поле с ключевым словом
event
подписываются через +=, а вызывают
из класса-источника.
Синтаксис
public event EventHandler Имя;
void Handler(object sender, EventArgs e) { }
Пример
Давайте подпишемся на EventHandler и вызовем событие:
using System;
class Worker
{
public event EventHandler Done;
public void Run()
{
Done?.Invoke(this, EventArgs.Empty);
}
}
class Program
{
static void OnDone(object sender, EventArgs e)
{
Console.WriteLine("abcde");
}
static void Main()
{
var worker = new Worker();
worker.Done += OnDone;
worker.Run();
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте передадим данные через EventHandler<TEventArgs>:
using System;
class ValueEventArgs : EventArgs
{
public int Value;
}
class Source
{
public event EventHandler<ValueEventArgs> Changed;
public void Raise(int value)
{
Changed?.Invoke(this, new ValueEventArgs { Value = value });
}
}
class Program
{
static void OnChanged(object sender, ValueEventArgs e)
{
Console.WriteLine(e.Value);
}
static void Main()
{
var source = new Source();
source.Changed += OnChanged;
source.Raise(5);
}
}
Результат выполнения кода:
5
Пример
Давайте вызовем два обработчика на одном событии:
using System;
class Hub
{
public event EventHandler Signal;
public void Fire()
{
Signal?.Invoke(this, EventArgs.Empty);
}
}
class Program
{
static void First(object sender, EventArgs e)
{
Console.Write("1");
}
static void Second(object sender, EventArgs e)
{
Console.Write("2");
}
static void Main()
{
var hub = new Hub();
hub.Signal += First;
hub.Signal += Second;
hub.Fire();
}
}
Результат выполнения кода:
"12"
Смотрите также
-
Delegate,
базовый класс дляEventHandler -
event,
которое ограничивает доступ к делегату -
Action,
который описывает метод без возвращаемого значения -
мультикаст,
когда один делегат вызывает несколько методов