2009-09-29 2 views
0

Когда это целесообразно поднять событие в C#?Когда использовать пользовательские события C#

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

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

ответ

4

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

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

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

0

В этом случае событие не имеет смысла. События обычно состоят в информировании о том, что происходит, а не для замены вызовов функций. Они более информативны.

Итак, вы можете передать функцию Action <>, чтобы затем вы могли вызвать функцию, которая была передана, чтобы выполнить обработку.

Это было бы лучше, чем вызов функции, ИМО.

Вы можете посмотреть на этой странице для примера: http://www.claassen.net/geek/blog/2007/12/action-func-never-write-another.html

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

+1

Я не согласен с оператором «не заменять вызовы функций». Обработчики событий - это функциональные вызовы. Событие предназначено для использования для предоставления коду (функциям) возможности выполнить, когда условие выполняется раздельно. Подумайте о средствах управления; они дают императивный код (функции) возможность запускать, когда пользователь что-то делает. Еще одно замечание: обработчики событий ARE и, таким образом, передача Action и передача EventHandler - это одно и то же; у них просто разные подписи. При этом я являюсь БОЛЬШИМ пользователем класса делегата Action –

+0

С точки зрения шаблонов то, что вы описываете, практически такое же, как событие, за исключением того, что требуется ровно один подписчик. –

+0

Я предпочитаю просто передавать функции Action <>, поскольку он избавляется от необходимости делегатов, и это упрощает мой код, я считаю, что делает его более гибким. –

1

IMO, использующий очередь, будет подходящим первым шагом. Обработка кода в очереди может в свою очередь либо поднимать события, либо принимать делегата, который выполняет разные задачи на основе типа объекта данных. Действие или Func должно хорошо работать здесь.

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

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