Где использовать события и делегаты? - PullRequest
5 голосов
/ 02 декабря 2010

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

Ответы [ 2 ]

8 голосов
/ 02 декабря 2010

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

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

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

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

public delegate void MyMessageHandlerType(string message);

public class EventTest
{
    public event MyMessageHandlerType MessageEvent
    {
        add { } // invoked when MessageEvent += SomeMethod
        remove { } // invoked when MessageEvent -= SomeMethod
    }
}
2 голосов
/ 02 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...