События и дилемма делегатов - PullRequest
2 голосов
/ 24 июля 2010

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

Если мне нужно использовать события для создания простого калькулятора, то как я могу использовать их, чтобы было 3 события: одно, которое можно использовать одно для цифры, одно для операторов и другое для равных или результата работа.

Ответы [ 7 ]

13 голосов
/ 20 сентября 2010

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

Событие - это просто то, что произошло в нашей программе.Когда это происходит, объекты, подписавшиеся на это событие, реагируют на это событие.В реальном мире это просто понять.Я бы взял пример крикета.Давайте возьмем удар по мячу как событие.Таким образом, как только игрок ударил по мячу, Филдер бежит к нему, судья отслеживает мяч, а игрок с битой следит за тем, где находится мяч.Публика готова вскрикнуть.Итак, удар по мячу - это событие.Бэтсмен, Судья, Филдер и Аудитория являются объектами, которые реагируют на это событие.Событие совершенно не знает, кто на него отреагирует и каким образом.Объекты, которые отвечают, должны сначала подписаться на это событие, а после этого всякий раз, когда событие запускается, они уведомляются и могут обрабатывать это событие любым удобным для них способом, как это делают наши Филдер, Судья, Аудитория, Бэтсман по-своему.В dotnet они обрабатывают события с помощью обработчиков событий.Это всего лишь краткое описание, касающееся сценария реального мира.Для дальнейшего чтения и хорошего понимания, пожалуйста, прочитайте темы в Head First C # by O'Reilly .Это действительно объясняет эти темы, прекрасно относящиеся к реальным примерам.Как только вы пройдете через это, вы сможете схватить это и иметь в виду.Надеюсь, это поможет:)

2 голосов
/ 24 июля 2010

Лотта хорошие вопросы с хорошими ответами здесь, вокруг событий и делегатов. Дайте им взгляд:

Разница между событиями и делегатами и соответствующими приложениями

В чем различия между делегатами и событиями?

Где я могу использовать делегатов?

наконец, никогда не стоит недооценивать ценность статьи Джона Скита:

http://pobox.com/~skeet/csharp/events.html

0 голосов
/ 20 сентября 2010

Вот фантастическая статья Джона Скита на эту тему, я также рекомендую приобрести копию его книги.

Делегаты и мероприятия.

0 голосов
/ 24 июля 2010

A делегат - это набор из одной или нескольких ссылок на методы с одинаковыми сигнатурами методов. В c # + (или +=) используется для добавления новых методов к делегату, а - (или -=) используется для удаления методов из делегата.

Событие - это то, что можно вызвать в коде, чтобы затем вызвать все методы, связанные с его делегатом. У событий почти всегда есть делегаты, которые возвращают void с двумя аргументами: Object sender и аргументы события, которые всегда являются классом, производным от System.EventArgs.

Например, если я хочу написать событие OnCookFood в моем классе Chef. Примечание: это предполагает, что я сначала написал CookEventArgs класс, потому что я, вероятно, хотел бы передать, какую еду готовит мой шеф-повар.

// modifier delegate void HandlerName(Object sender, EventArgsClass e)
// modifier event HandlerName EventName
public delegate void CookFoodHandler(Object sender, CookEventArgs e);
public event CookFoodHandler OnCookFood;

// More code...
OnCookFood(new CookEventArgs("Pie"));

Конечно, это сложный способ сделать это. Вы можете использовать класс EventHandler<T>, чтобы компилятор создал делегат для вас:

public event EventHandler<CookEventArgs> OnCookFood;

// More code...
OnCookFood(new CookEventArgs("Pie"));

и, наконец, добавить обработчик; при условии, что у нас есть объект cook:

void HandleCooking(Object e, CookEventArgs e) {
    // Do something here
}

// in another function, probably the constructor...
cook.OnCookFood += HandleCooking;
0 голосов
/ 24 июля 2010

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

Разницу можно понять, если вы увидите шаблон проектирования Observer, у которого есть несколько подписчиков на одно событие.Класс Publisher обнаружит какое-либо «Событие» и вызовет его, и будут вызваны все подписчики.

, как если бы вы создали класс кнопки, а контейнер хочет подписаться на событие click, он присоединит свой обработчик ксобытие щелчка, которое вызывает ваш класс кнопок.

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

0 голосов
/ 24 июля 2010

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

В какой-то момент «владелец» этого события может поднять его. Который будет вызывать все экземпляры делегата в «коллекции».

0 голосов
/ 24 июля 2010

Я знаю, что dat-делегаты являются объектами

Это не совсем так.Делегаты - это типы.События - это экземпляры делегатов (которые помечены специальными ключевыми словами, чтобы генерировать дополнительный персонал с помощью компилятора).

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