Событие
Ключевое слово event объявляет делегат,
на который снаружи можно только подписаться
или отписаться - операторы += и -=.
Вызов события из класса-владельца выполняют
как обычный делегат, часто через ?.Invoke.
Так скрывают детали и не дают постороннему
коду перезаписать список подписчиков.
Синтаксис
public event Action Имя;
объект.Имя += обработчик;
Имя?.Invoke();
Пример
Давайте подпишемся на event и получим
сообщение при вызове:
using System;
class Notifier
{
public event Action? Done;
public void Run()
{
Done?.Invoke();
}
}
class Program
{
static void Main()
{
var notifier = new Notifier();
notifier.Done += () => Console.WriteLine("abcde");
notifier.Run();
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте добавим второго подписчика через
+=:
using System;
class Notifier
{
public event Action? Ping;
public void Fire()
{
Ping?.Invoke();
}
}
class Program
{
static void Main()
{
var notifier = new Notifier();
notifier.Ping += () => Console.Write("1");
notifier.Ping += () => Console.Write("2");
notifier.Fire();
}
}
Результат выполнения кода:
12
Пример
Давайте отпишем обработчик оператором -=:
using System;
class Notifier
{
public event Action? Ping;
public void Fire()
{
Ping?.Invoke();
}
}
class Program
{
static void Main()
{
var notifier = new Notifier();
Action handler = () => Console.WriteLine("skip");
notifier.Ping += handler;
notifier.Ping -= handler;
notifier.Ping += () => Console.WriteLine("12345");
notifier.Fire();
}
}
Результат выполнения кода:
"12345"