繁体   English   中英

我是否使用委托或事件

[英]Do I use a delegate or an event

我有一个Connection类,该类从文本流中读取数据包(命令),然后将命令分发到一组处理程序,这些处理程序将在适当时处理这些命令。

例如,Connection类读取命令“ HELLO”,然后将该命令传递给处理程序,其中一个或多个处理程序可能会对HELLO命令执行一些有用的操作。

现在,我使用一个名为HandleCommand的委托,所有命令处理程序都必须遵守该委托才能接收命令。

问题是,使用处理程序可以单独订阅的事件(例如CommandReceived)是否更合乎逻辑? 我很难权衡利弊。 使其成为事件似乎更为浪费,因为随后必须为收到的每个命令生成一个EventArgs类。

相反,还有一个DisconnectCallback委托,我坚信作为一个事件会更好,并且可能会发生变化。

谢谢

看来您的分发者现在必须保留处理程序列表(类或委托)。 这意味着您正在复制event的功能。

这种情况似乎需要发生事件。 它将使组件分离。

关于事件和eventarg的“浪费性”,请参见此问题并不再担心。

首先-在没有证据表明这是性能瓶颈之前,请不要牺牲清晰度。 GC速度很快,清理短时间的eventargs类不太可能成为此处的主要性能因素。

无论如何,如果消费者只打算读取而不修改数据,那么我将其作为一个事件。 否则,您可能希望为一个“过滤器”创建一个接口,该接口可以读取和修改,并将新值传递给下一个接口。

事件将是最明显的方法,因为有多个命令处理程序。

我很好奇命令处理程序如何使用委托“附着”到连接。 您必须通过使用侦听器列表来模拟事件行为,或者命令必须主动调用处理程序,这实际上影响了解耦。

创建事件时不需要使用EventHandler或EventHandler <T>,即使这样做违反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);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM