我有一个Connection类,它从文本流中读取数据包(命令),然后将命令分发给一组处理程序,这些处理程序按照自己的意愿处理命令。
例如..连接类读入命令“HELLO”,然后将命令传递给处理程序,其中一个或多个处理程序可以对HELLO命令执行一些有用的操作。
现在我使用一个名为HandleCommand的委托,所有命令处理程序必须遵守该委托才能接收命令。
问题是,使用处理程序可以单独订阅的事件(例如.. CommandReceived)会更合乎逻辑吗?我很难权衡利弊。将它作为一个事件似乎更浪费,因为必须为每个收到的命令生成一个EventArgs类。
相比之下,还有一个DisconnectCallback委托,我坚信它会更好地作为一个事件并且可能会改变。
谢谢
答案 0 :(得分:2)
现在看来您的经销商必须保留一份处理程序列表(类或代表)。这意味着您正在复制event
。
这种情况似乎要求举办活动。它会解耦组件。
关于事件和事件的“浪费”,请参阅this question并停止担心。
答案 1 :(得分:1)
首先 - 直到你有证据表明它是性能瓶颈,不要牺牲清晰度。 GC很快,并且不太可能清理短期的事件类将成为这里的主要性能因素。
无论如何,如果消费者只是阅读而不是修改数据,我会把它变成一个事件。否则,您可能想要为可以读取和修改的“过滤器”创建一个接口,并将新值传递给下一个。
答案 2 :(得分:1)
事件是最明显的方法,因为有多个命令处理程序。
我很好奇命令处理程序如何使用委托“遵守”连接。您必须通过使用侦听器列表来模拟事件行为,或者命令必须主动调用处理程序,这确实会破坏解耦。
答案 3 :(得分:0)
您不需要使用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);
}
}