Аксессоры событий
95C# --- Руководство по C# --- Аксессоры событий
Для управления списком обработчиков событий служит расширенная форма оператора event, позволяющая использовать аксессоры событий. Эти аксессоры предоставляют средства для управления реализацией подобного списка в приведенной ниже форме:
event делегат_события имя_события { add { // Код добавления события в цепочку событий } remove { // Код удаления события из цепочки событий } }
В эту форму входят два аксессора событий: add и remove. Аксессор add вызывается, когда обработчик событий добавляется в цепочку событий с помощью оператора +=. В то же время аксессор remove вызывается, когда обработчик событий удаляется из цепочки событий с помощью оператора -=.
Когда вызывается аксессор add или remove, он принимает в качестве параметра добавляемый или удаляемый обработчик. Как и в других разновидностях аксессоров, этот неявный параметр называется value. Реализовав аксессоры add или remove, можно организовать специальную схему хранения обработчиков событий. Например, обработчики событий можно хранить в массиве, стеке или очереди.
Вышесказанное иллюстрирует нижеследующее:
using System;
namespace ConsoleApplication1
{
delegate void UI ();
class MyEvent
{
UI[] evnt = new UI[5];
// Объявляем событие
public event UI UserEvent
{
// Используем аксессоры событий
add
{
evnt[1] = value;
}
remove
{
evnt[1] = null;
}
}
// Используем метод для запуска события
public void OnUserEvent()
{
evnt[1]();
}
}
class UserInfo
{
string uiName, uiFamily;
int uiAge;
public UserInfo(string Name, string Family, int Age)
{
this.Name = Name;
this.Family = Family;
this.Age = Age;
}
public string Name { set { uiName = value; } get { return uiName; } }
public string Family { set { uiFamily = value; } get { return uiFamily; } }
public int Age { set { uiAge = value; } get { return uiAge; } }
// Обработчик события
public void UserInfoHandler()
{
Console.WriteLine("Событие вызвано!\n");
Console.WriteLine("Имя: {0}\nФамилия: {1}\nВозраст: {2}",Name,Family,Age);
}
}
class Program
{
static void Main()
{
MyEvent evt = new MyEvent();
UserInfo user1 = new UserInfo(Name: "Alex", Family: "Erohin", Age: 26);
// Добавляем обработчик события
evt.UserEvent += user1.UserInfoHandler;
// Запустим событие
evt.OnUserEvent();
Console.ReadLine();
}
}
}
Длинная нотация для определения событий удобна, если необходимо сделать нечто большее, чем просто добавлять и удалять обработчики событий, например, добавить синхронизацию для многопоточного доступа. Элементы управления WPF используют длинную нотацию для добавления функциональности "пузырькового" и туннельного распространения событий.