Аксессоры событий
Для управления списком обработчиков событий служит расширенная форма оператора 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 используют длинную нотацию для добавления функциональности "пузырькового" и туннельного распространения событий.
Комментарии