我是否使用委托或事件

| 我有一个Connection类,该类从文本流中读取数据包(命令),然后将命令分发到一组处理程序,这些处理程序将在适当时处理这些命令。 例如,Connection类读取命令\“ HELLO \”,然后将该命令传递给处理程序,其中一个或多个处理程序可能会对HELLO命令执行一些有用的操作。 现在,我使用一个名为HandleCommand的委托,所有命令处理程序都必须遵守此委托才能接收命令。 问题是,使用处理程序可以单独订阅的事件(例如CommandReceived)是否更合乎逻辑?我很难权衡利弊。使其成为事件似乎更为浪费,因为随后必须为每个收到的命令生成一个EventArgs类。 相比之下,还有一个DisconnectCallback委托,我坚信该委托作为一个事件会更好,并且可能会发生变化。 谢谢     
已邀请:
看来您的分发者现在必须保留处理程序列表(类或委托)。这意味着您正在复制“ 0”的功能。 这种情况似乎需要发生事件。它将使组件分离。 关于事件和eventarg的“浪费”,请查看此问题,然后再再担心。     
首先-在没有证据表明这是性能瓶颈之前,请不要牺牲清晰度。 GC速度很快,清理短时间的eventargs类不太可能成为此处的主要性能因素。 无论如何,如果使用者只打算读取而不修改数据,那么我将使其成为一个事件。否则,您可能想要为一个可以读取和修改的“过滤器”建立接口,并将新值传递给下一个接口。     
事件将是最明显的方法,因为有多个命令处理程序。 我很好奇命令处理程序如何使用委托“连接”到连接。您必须通过使用侦听器列表来模拟事件行为,或者命令必须主动调用处理程序,这实际上影响了解耦。     
创建事件时不需要使用EventHandler或EventHandler ,即使这样做与Microsoft的建议相反。您可以使用当前的委托作为事件的数据类型,如下所示:
public event MyDelegateType EventName;
编辑: 如果您担心性能,则可以使用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);
  }
}
    

要回复问题请先登录注册