MyTetra Share
Делитесь знаниями!
Время создания: 13.07.2020 20:25
Раздел: Компьютер - C# - Вопросы на программиста
Запись: Kozlov-AE/Tetra/master/base/1594661150m4emag5b31/text.html на raw.githubusercontent.com

Делегаты события


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

public class A

{   

public void OnDoWork()   

{     

if ( DoWork != null )       

DoWork(this, EventArgs.Empty);  

}   

public event EventHandler DoWork;

}


1. Что будет с программой, если класс A видоизменить так: убрать ключевое слово event? 2. Что будет с программой, если вообще во всем коде убрать ключевые слова event?


синтаксические отличия применимости событий от делегатов:


0. Событие — это тот же самый делегат, который наделяется некоторыми свойствами через слово event.

1. И событие и делегат можно объявить полем класса, но в отличие от делегата, событие не может быть локальной переменной метода (особо не роляет, но помнить стоит)

2. Событие нельзя запустить вне класса, в котором оно было объявлено (это самое важное отличие!!!)

3. Интерфейс не может содержать поля.

4. Событие всегда объявляется как «поле», а не свойство (add-remove не в счет).


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

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

1. Ничего не изменится

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

 
MyTetra Share v.0.65
Яндекс индекс цитирования