Я использую делегата или событие - PullRequest
2 голосов
/ 15 апреля 2011

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

Например. Класс подключения читает вкоманда «HELLO», а затем передает команду обработчикам, где один или несколько обработчиков могут сделать что-то полезное с командой HELLO.

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

Вопрос в том, будет ли логичнее использовать событие (например, CommandReceived), на которое обработчики могут подписаться индивидуально?Мне тяжело взвесить все за и против.кажется более расточительным сделать его событием, потому что тогда для каждой полученной команды должен быть создан класс EventArgs.

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

Спасибо

Ответы [ 4 ]

2 голосов
/ 15 апреля 2011

Кажется, ваш дистрибьютор должен вести список обработчиков (класс или делегаты). Это означает, что вы дублируете функциональность event.

Ситуация, кажется, требует событий. Это будет разъединять компоненты.

Относительно «расточительности» событий и событийных событий см. этот вопрос и перестаньте беспокоиться.

1 голос
/ 15 апреля 2011

События будут наиболее очевидным подходом, так как имеется более чем одного обработчика команд.

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

1 голос
/ 15 апреля 2011

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

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

0 голосов
/ 15 апреля 2011

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

public event MyDelegateType EventName;

Edit: Если вас беспокоит производительность, вы можете использовать класс EventHandlerList следующим образом:

private EventHandlerList _events = new EventHandlerList();
private static object MyDelegateKey = new object()
public event MyDelegate EventName {
  add {
     _events.AddHandler(MyDelegateKey, value);
  }
  remove {
     _events.RemoveHandler(MyDelegateKey, value);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...