Как выбрать метод или событие? - PullRequest
1 голос
/ 24 февраля 2011

Я читал вопрос давным-давно «Как события C # работают за кулисами?» и Джон ответил, что все события похожи на методы ...

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

В основном, если я хочу получить большое красное / зеленое изображение состояния, которое связано с полем Bool, и я хочу изменить его в зависимости от значения bool, я должен:

а) Иметь метод с именем Changepicture, который связан с полем и изменяет состояние bool и изображения.

b) Получить часть / получить часть в поле и прикрепить событие в установленной части.

c) Получить часть / получить часть в поле и добавить метод в часть набора.

г) Другое?

Ответы [ 4 ]

1 голос
/ 24 февраля 2011

Для получения дополнительной информации о событиях см. запись .

0 голосов
/ 24 февраля 2011

Лучший способ выяснить, что вам следует делать, это посмотреть на классы в .NET Framework и посмотреть, как они спроектированы.

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

Поскольку события в .NET являются многоадресными, что означает, что несколько объектов могут подписываться и, следовательно, получать уведомления о происходящем событии, это может быть другой причиной для вызова события в ваших объектах. События также следуют шаблону наблюдателя в том смысле, что субъект (ваш класс) действительно не знает о подписчиках (слабо связанных). Хотя для вызова метода у вторичного объекта должна быть ссылка на экземпляр вашего класса.

Обратите внимание, что метод в вашем классе в конечном итоге вызывает и событие. Допустим, у вас есть метод в вашем классе с именем ChangePicture. Затем в реализации метода вы можете в конечном итоге вызвать событие PictureChanged. если кто-то заинтересован в получении уведомления об этом событии, он может подписаться на это событие. Этот человек, как правило, не тот, кто вызвал метод для изменения картинки.

События являются делегатами. Делегаты являются объектами. События на самом деле являются MulticastDelegates (базовый класс в .NET Framework). Эти объекты в конечном итоге вызывают метод, который вызывается как часть уведомления о событии. Так что они немного «тяжелее», чем просто вызов метода, но это почти никогда не должно определять ваш дизайн.

0 голосов
/ 24 февраля 2011

Ответ: это зависит. Если ваше логическое значение находится в классе codebehind вашего визуального компонента (например, WinForm), вы можете вызвать метод ChangePicture без каких-либо странных действий. Но если ваше булево значение архитектурно более удалено от визуального компонента, событие является правильным способом обработки сценария, потому что вы не можете легко вызвать метод визуального компонента, потому что класс, который содержит логическое значение, возможно, даже не знает Ваш визуальный компонент существует. :)

0 голосов
/ 24 февраля 2011

У вас есть варианты.

Если ваш объект уже реализует INotifyPropertyChanged и ваше красно-зеленое изображение является элементом управления, который поддерживает привязку данных, вы можете просто вызвать событие NotifyPropertyCHanged в методе set bool и добавить привязку данных для этого свойства в свой элемент управления.

Если не реализовывать INotifyPropertyChanged, я все равно рекомендую сделать что-то подобное. То есть создайте свой собственный обработчик события и подпишитесь на событие reg / green picture. Просто прямой вызов метода из набора вашего свойства создает тесную связь, что обычно является плохой вещью.

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