iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0
自我挑戰組

學習C#續系列 第 18 篇

Day 18:發行者/訂閱者模式(Publisher-Subscriber Pattern)

  • 分享至 

  • xImage
  •  

發行者/訂閱者模式(Publisher-Subscriber Pattern):

  • 發行者(Publisher):負責定義事件、監控狀態改變並在特定條件下「引發(觸發)」事件。發行者完全不知道是誰在監聽,達到高內聚。
  • 訂閱者(Subscriber):負責註冊(監聽)該事件,並在事件觸發時執行對應的處理邏輯(回呼方法)。
  • 解耦元件通訊(Decoupling):發行者與訂閱者之間不直接互相依賴具體型別,只透過「事件」這條管道溝通,大幅降低系統相依度。

event 關鍵字:

  • event 是包裝在委派(Delegate)之上的封裝修飾詞。
  • 封裝安全性:若直接使用公開委派,外部程式碼可能使用 = 覆蓋掉其他人的監聽,或是隨意在外部觸發調用。加上 event 後,外部只能使用 +=(訂閱)與 -=(退訂),只有定義事件的類別內部才有權限呼叫觸發(Invoke)。

標準 EventHandler 與 EventArgs 規範:

  • .NET 官方推薦的事件簽章標準格式為:void MethodName(object? sender, EventArgs e)。
    • sender:代表觸發該事件的來源物件本身(通常傳入 this)。
    • e:攜帶與此事件相關的附加資料。
  • 泛型版本 EventHandler:
    • 建立自訂類別並繼承 EventArgs,用來封裝要傳給訂閱者的詳細參數。
    • 使用內建泛型委派 public event EventHandler? OnAction;,免除自行宣告自訂 delegate 的繁瑣步驟。

實作範例
https://ithelp.ithome.com.tw/upload/images/20261001/20178925GvwVNqYJeV.png

https://ithelp.ithome.com.tw/upload/images/20261001/20178925if2yUWV18k.png

https://ithelp.ithome.com.tw/upload/images/20261001/20178925n6KtjloZvN.png

https://ithelp.ithome.com.tw/upload/images/20261001/20178925hzTxMVaXiN.png


上一篇
Day 17:select 子句投影作用、LINQ to Object
下一篇
Day 19: 擴充方法(Extension Methods)與現代模式比對(Pattern Matching)
系列文
學習C#續 共 20 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言