Аксессоры событий

95

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

Пройди тесты
Лучший чат для C# программистов