События c#

Рейтинг: 1Ответов: 1Опубликовано: 23.09.2014

Господа просветите пожалуйста по событиям. Читаю по Шилдту, то ли перевод такой. То ли я не могу разобраться. Вот код который приводится в книге в качестве примера

using System;

delegate void MyEventHandler();

class MyEvent { 
  public event MyEventHandler SomeEvent;

  public void OnSomeEvent() { 
    if(SomeEvent != null) 
      SomeEvent(); 
  } 
}

class EventDemo { 
    static void Handler() { 
    Console.WriteLine("Event occurred"); 
  }

  static void Main() {  
    MyEvent evt = new MyEvent();

    evt.SomeEvent += Handler;

    evt.OnSomeEvent(); 
  } 
}

С кодом вроде все понятно. Но вот его дальнейшее описание вводит в заблуждение. Подскажите пожалуйста это трудности перевода или трудности в моем понимании темы

Кроме того, в классе MyEvent объявляется метод OnSomeEvent (), вызываемый для сигнализации о запуске события. Это означает, что он вызывается, когда происходит событие.

Я не пойму метод вызывает событие или событие метод ? Я так понял, что метод OnSomeEvent () вызывает событие.

В методе OnSomeEvent () вызывается обработчик событий с помощью делегата SomeEvent.

Но имя делегата вроде MyEventHandler ? Или я что-то не понял ?

Вызов метода OnSomeEvent () приводит к вызову всех событий, зарегистрированных обработчиком.

Может быть к вызову всех зарегистрированных ОБРАБОТЧИКОВ для события ?

И еще вопросик совсем мелкий. Правильно ли я понял, что в методе OnSomeEvent() происходит все таким образом, что в методе сигнализируется само событие и автоматически (если подключен) вызывается его обработчик ?

Спасибо. Для меня очень важно получить ответы. Спасибо еще раз

Ответы

▲ 1Принят
  1. Метод OnSomeEvent вызывает событие SomeEvent. Если Вы посмотрите на то, как реализовано большинство классов в .NET Framework, Вы увидите, что это общепринятый способ генерации событий.
  2. Возможно, в книге не очень удачно сформулировано. Когда Вы объявляете делегат, Вы создаёте тип данных. Когда Вы объявляете событие, Вы создаёте член класса или интерфейса, который имеет этот тип. Соответственно, под выражением "делегат SomeEvent" подразумевается поле Вашего класса, которое создаётся при объявлении события. А тип этого поля - MyEventHandler.
  3. Вы правильно понимаете, когда Вы обращаетесь к делегату так, как будто вызываете метод, вызываются все методы, подписанные на это событие.
  4. Метод OnSomeEvent реализован таким образом, что если на событие никто не подписан, оно не инициируется. Если хоть кто-то подписан, оно инициируется, и тогда отработают все обработчики этого события.