2012-05-17 2 views
1
Button.Click += new RoutedEventHandler(_click); 

private void _click(object sender EventArgs e) 
{ 
    //... 
} 

В приведенном выше коде мы создаем экземпляр типа RoutedEventHandler, который является делегатом, с событием Button.Click. Но событие является абстрактным делегатом, не так ли? Я не понимаю разницы между этим и просто созданием RoutedEventHandler переменной, а затем добавлением переменных в список вызовов экземпляра. Я делаю это слишком сложно? Как работают все задействованные делегаты?События и делегаты

Редактировать: так что моя главная проблема заключается в том, чтобы просто устранить разрыв между тем, что я знаю о делегатах, и тем, что я знаю о событиях. Я знаю, что событие является делегатом, завернутым в другой слой абстракции. Поэтому, когда вы назначаете другой делегат в свой список вызовов, используя оператор + =, вы просто назначаете делегата другому делегату, исправьте? Но в коде, который я написал выше, вы фактически не создаете класс RoutedEventHandler, поэтому я смущен тем, как вы передаете его в список вызовов события Button.Click. Я также запутался, потому что кажется, что все на самом деле указывает на что-то еще с делегатами и событиями, и ссылки усложняются.

+0

вы имели в виду что-то вроде: - RoutedEventHandler г = новый RoutedEventHandler (_click); Button.Click + = г ;? –

+0

Да; но я не думаю, что я задам себе вопрос. Я знаю, как написать обработчик событий, я просто пытаюсь понять события и делегаты на более глубоком уровне. Есть пробел между тем, что я знаю о делегатах, а затем то, что я знаю о событиях. Я отредактирую свой вопрос, чтобы попытаться сформулировать его лучше. –

ответ

1

Возможно, этот ответ поможет you.He объяснил это в хорошей детализации : -

Events

+0

Отлично, это то, что я искал! Благодаря! –

1

Вы можете представить события как обертки для коллекции делегатов (с некоторым синтаксическим сахаром для добавления/удаления элементов). События связаны с многоадресной рассылкой вызова нескольким делегатам, вы можете добавить настраиваемую логику для добавления (или не) делегирования делегата (так же, как вы можете обернуть поле в свойстве и добавить некоторую логику в getter/setter для свойства). Наличие события в классе «рекламирует» мир, что они могут безопасно добавлять обработчики (которые реализованы как делегаты) для получения указанных событий - и это позволяет такие вещи, как интеграция времени разработки с такими IDE, как Visual Studio.

+0

Спасибо Карлосу, это полезная информация! –

1

Когда вы используете делегат в контексте события, компилятор будет генерировать как поле поддержки для делегата, так и общедоступное свойство add/remove для подписчиков для присоединения к событию. Вы можете просто использовать делегат как событие, как вы описываете, однако вы не будете в состоянии ограничить абонент только + = и - =

private EventHandler _backingDelegate; 
public event EventHandler Click { 
    add { 
     _backingDelegate += value; 
    } 
    remove { 
     _backingDelegate -= value; 
    } 
} 
+0

Спасибо aqwert! Хорошая информация. –

Смежные вопросы