Skip to Content

Коварный вопрос по Event,Delegate

На собеседованиях любят задавать всякие каверзные вопросы. Одним из любимых вопросов на понимание .net платформы является вопрос про события и делегаты. В лучшем случае спрашивают отличия, в худшем могут задать такой вопрос на засыпку.

Дан код:

1
2
3
4
5
6
7
8
9
10
public class A
{
  public void OnDoWork()
  {
    if ( DoWork != null )
      DoWork(this, EventArgs.Empty);
  }
 
  public event EventHandler DoWork;
}
  1. Что будет с программой, если класс A видоизменить так: убрать ключевое слово event?
  2. Что будет с программой, если вообще во всем коде убрать ключевые слова event?

Неподготовленных вопросы вводят в жуткий когнитивный диссонанс, как только они их осознают. Здесь главное удержаться от негодующего вопля и вспомнить синтаксические отличия применимости событий от делегатов:

  1. Событие — это тот же самый делегат, который наделяется некоторыми свойствами через слово event.
  2. И событие и делегат можно объявить полем класса, но в отличие от делегата, событие не может быть локальной переменной метода (особо не роляет, но помнить стоит)
  3. Событие нельзя запустить вне класса, в котором оно было объявлено (это самое важное отличие!!!)
  4. Интерфейс не может содержать поля.
  5. Событие всегда объявляется как «поле», а не свойство (add-remove не в счет).

Это, пожалуй, единственные отличия события от делегата (я не берусь рассматривать семантическую разницу). Ну, или я что-то забыл, но вы мне сейчас напомните:)

Итак, если у нас есть интерфейс, в котором объявлено событие, и мы убираем ключевое слово event, то у нас возникает ошибка компилятора — дескать, интерфейс не может содержать поля (а именно полем-делегатом стало бывшее событие). Но если событие объявлено как поле класса, то с точки зрения компилятора будет совершенно корректно убрать ключевое слово.

Поэтому ответы на вопросы будут такие:

  1. Ничего не изменится
  2. Ничего не изменится, если только в программе нет объявленных в интерфейсах событий.

Да, и еще вот что удивительно — при ответе на вопрос некоторые начинают рассуждать, что событие — это MulticastDelegate, а вот Delegate может содержать ссылку только на один метод. В общем, это совершенно жуткая ересь, но тем не менее несколько разных людей мне таким образом пытались дать ответ на эти два вопроса. Откуда пошел этот миф, неизвестно. Если есть желание посмотреть, в чем же отличие MulticastDelegate от Delegate — можно сбегать поглядеть статью мегаавторитета Брэда Абрамса — и убедиться, что различий между этим классами, кроме названия, нет.

П.С. Да, я знаю, что OnDoWork() не thread safe:)

<— { послепоста реклама

Токарные станки применяются в нашей жизни повсеместно – автомастерские, ремонтные цеха автотранспорта, мастерские при котельных. С их помощью опытные работники, токари, достаточно изготовляют самый большой спектр необходимых на производстве деталей.

Токарные станки с чпу позволяют производить изделия гораздо быстрее и тщательнее, чем вручную. К недостатком можно отнести необходимость составления программы для станка.

послепоста } —>

Нет комментариев к “Коварный вопрос по Event,Delegate” Написать комментарий ›

Написать комментарий

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>