簡體   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