Задать вопрос
BadCats
@BadCats

Перевызов событий?

всем привет, имеется данный пример:
public delegate void EventDelegate();

    public class MyClass
    {
        public event EventDelegate myEvent = null;

        public void InvokeEvent()
        {
            myEvent.Invoke();
        }
    }

    class Program
    {
        // Методы обработчики события.

        static private void Handler1()
        {
            Console.WriteLine("Обработчик события 1");
        }

        static private void Handler2()
        {
            Console.WriteLine("Обработчик события 2");
        }

        static void Main()
        {
            MyClass instance = new MyClass(); 

            // Присоединение обработчиков событий. (Подписка на событие)
            instance.myEvent += new EventDelegate(Handler1);
            instance.myEvent += Handler2;

            // Метод который вызывает событие.
            instance.InvokeEvent();

            Console.WriteLine(new string('-', 20));

            // Открепляем Handler2().
            instance.myEvent -= new EventDelegate(Handler2);

            instance.InvokeEvent();

            // Delay.
            Console.ReadKey();
        }
    }


Зачем тут метод InvokeEvent, который перевызывает событие myEvent?

Зачем вообще перевызывать событие? Почему не вызвать его "напрямую" - как метод?
  • Вопрос задан
  • 215 просмотров
Подписаться 2 Оценить 11 комментариев
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C#
Потому что ивент - это не то же самое, что делегат. Ивент ограничивает интефейс делегата только двумя операциями - добавить и удалить обработчик. Это делается для того, чтобы только изнутри объекта можно было сгенерировать событие. Иными словами, чтобы никто не мог, к примеру, "нажать" кнопку вместо самой кнопки (т.е. сгенерировать событие Clicked в обход внутренней логики класса "Кнопка"). В этом принципиальный смысл концепции событий.

Можно провести аналогию между полем/свойством и делегатом/событием. Как свойство - это в некоторых случаях "интерфейс" для поля, который позволяет контроллировать, как оно изменяется (при этом вы можете использовать генерируемое поле с помощью синтаксиса { get; set; }), так и событие это "интерфейс" для делегата - вы не можете напрямую изменять или вызывать делегат, вы делаете это с помощью события. Можете также почитать про синтаксис add/remove у событий - тогда аналогия со свойством будет еще понятнее.

Зачем делать InvokeEvent не совсем понятно, видимо это просто какой-то пример. В реальном коде класс MyClass должен сам решить, когда вызывать то или иное событие.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы