2010-12-02 3 views
5

Я использовал события и делегаты во многих своих проектах, но все же у меня есть некоторые сомнения в моем сознании, где использовать события и делегаты в проекте, а какая разница между делегатом и событием. Может кто-нибудь объяснить это пожалуйста?Где использовать события и делегаты?

+0

приятное объяснение здесь: http://blog.monstuff.com/archives/000040.html – SubniC 2010-12-02 12:32:22

ответ

8

A Delegate - тип, который может инкапсулировать вызов метода. Вы должны использовать делегат, если хотите обработать метод как объект и передать его.

Event - это всего лишь способ разоблачить делегата как свойство, к которому любой код вне вашего класса может присоединить своих обработчиков, но не может вызвать делегата. Если вы выставляете своего делегата как общедоступное свойство, код вне вашего класса может не только прикреплять свои обработчики, но и вызывать делегат.

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

Вы должны использовать событие, если хотите, чтобы другие классы подписывались на мероприятие в вашем классе и уведомлялись, когда это происходит.

public delegate void MyMessageHandlerType(string message); 

public class EventTest 
{ 
    public event MyMessageHandlerType MessageEvent 
    { 
     add { } // invoked when MessageEvent += SomeMethod 
     remove { } // invoked when MessageEvent -= SomeMethod 
    } 
} 
2

Оба делегата и события обеспечивают механизм обратного вызова. Событие предоставляет механизм обратного вызова, который несколько менее подключен, чем delagate, в этом он может иметь любое количество подключенных обработчиков и что код часто работает одинаково независимо от количества обработчиков (если они есть). Хорошим примером может быть событие окна Resized; изменение размера окна будет работать независимо от того, подключен ли какой-либо обработчик событий; событие является механизмом уведомления.

Делегат более связан во многих смыслах. Как правило, вы можете связать точно одним способом с делегатом, и часто они ожидаются; возьмите, например, методы расширения LINQ (например, Where): они не будут работать, если вы не предоставите точно один метод для параметра делегата.

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