有關委托和事件的文章已經有很多, 之前看過一篇講的實例比較形象, 因此借鑒並加以改進一下, 希望能夠幫助還沒有過這道坎的同學;
借鑒文章: https://www.cnblogs.com/yinqixin/p/5056307.html
本文沒有任何概念介紹,旨在幫助同學們快速用上委托和事件,越過這道坎。
應用場景舉例:
劉備設鴻門宴, 吩咐關羽和張飛各自帶隊埋伏在門外, 劉備摔杯為號, 關羽和張飛則帶隊殺出;
關羽和張飛殺出的具體過程, 他們自己實現即可.
但劉備會不會摔杯, 什么時候摔杯 劉備自己也不知道..得看情況..
所以當然不能用傳統方式, 在劉備摔杯的方法里面調用關羽和張飛的殺出方法,
如果劉備(BOSS)臨時變卦, 要多安排趙雲,馬超,黃忠等等眾多將領在門外呢?
那劉備的摔杯方法豈不是要調用所有將領的殺出方法?
這樣寫代碼要傳遞眾多將領對象, 劉備的摔杯方法會進行無盡的修改和完善,顯然不是我們所希望的。
使用委托和事件的實現方式:
首先定義劉備,關羽,張飛3個類:
劉備有摔杯的委托和事件, 以及摔杯方法;
關羽和張飛則有殺出方法;

public class 劉備 { public delegate bool 摔杯委托(string str); public event 摔杯委托 摔杯事件; public void 摔杯方法() { if (摔杯事件 != null) 摔杯事件("猛猛的摔杯 (只是示例個參數)"); } } public class 關羽 { public bool 殺出(string str) { Console.WriteLine("關羽帶300刀斧手從北門殺出!"); return true; } } public class 張飛 { public bool 殺出(string str) { Console.WriteLine("張飛帶300刀斧手從南門殺出!"); return true; } }
那么為了方便大家理解注冊事件, 也就是關羽和張飛接受劉備的摔杯為號的約定, 我們先這樣寫:

static class Program { static void Main() { 劉備 lb = new 劉備(); 關羽 gy = new 關羽(lb); 張飛 zf = new 張飛(lb); //分別注冊事件 lb.摔杯事件 += gy.殺出; lb.摔杯事件 += zf.殺出; //劉備摔杯 lb.摔杯方法(); } }
最終完整代碼如下:
(下面代碼注冊事件改為在對象內部實現)

using System; namespace Test { static class Program { static void Main() { 劉備 lb = new 劉備(); 關羽 gy = new 關羽(lb); //可以理解為, 劉備與關羽約定好摔杯殺出, 然后關羽自己注冊事件 張飛 zf = new 張飛(lb); //同上 //劉備摔杯 lb.摔杯方法(); } } public class 劉備 { public delegate bool 摔杯委托(string str); public event 摔杯委托 摔杯事件; public void 摔杯方法() { if (摔杯事件 != null) 摔杯事件("猛猛的摔杯 (只是示例個參數)"); } } public class 關羽 { public 關羽(劉備 lb) { lb.摔杯事件 += 殺出; } public bool 殺出(string str) { Console.WriteLine("關羽帶300刀斧手從北門殺出!"); return true; } } public class 張飛 { public 張飛(劉備 lb) { lb.摔杯事件 += 殺出; } public bool 殺出(string str) { Console.WriteLine("張飛帶300刀斧手從南門殺出!"); return true; } } }
大家再想一想, 如果還有趙雲,馬超,黃忠等等更多將領呢?
程序拓展也非常方便, 定義好新將領的類並實現殺出方法即可, 和關羽張飛代碼類似;
使用設計模式的話, 可以建立一個將領的父類, 實現基本的殺出方法. 如果個別將領有特別的殺出方法, 重寫殺出方法即可.
如果有不對的地方歡迎指出