?// 工具人類
namespace DownStair
{delegate void DownStairDelegate(); // 定義了一個下樓委托class ToolMan{public string Name { get; set; } // 聲明工具人的名字屬性// public DownStairDelegate downStairDelegate = null; // 初始化委托downStair為空委托// 解決方案public event DownStairDelegate downStairDelegate = null; public ToolMan(string name) // 構造函數獲取工具人名字{Name = name;}public void DownStair() // 定義了一個方法:工具人下樓幫忙帶東西{Console.WriteLine("工具人" + Name + "下樓了");//downStair(); // error,未將對象引用設置到對象的實例// 解決方案if (downStairDelegate != null){downStairDelegate(); // 定義event后,只能在ToolMan類的內部觸發}}}
}
// 懶人類
class Lazyman{public string Name { get; set; }public Lazyman(string name){Name = name;}public void TakeFood(){Console.WriteLine("給" + Name + "帶盒飯");}public void TakePackage(){Console.WriteLine("給" + Name + "拿快遞");}public void PrintFile(){Console.WriteLine("給" + Name + "打印文件");}}
// 調用運行
// 事件(event):// 基于委托,是類或對象向其他類或對象通知發生的事情的一種特殊簽名的委托,事件的聲明// 受限制的委托,只能施加 +=、-= 操作符,只允許add、remove方法操作// 不允許直接賦值,只能在類的內部觸發 // 類似訂閱和發布class Program{static void Main(string[] args){// 工具人下樓問題// 創建對象ToolMan toolman = new ToolMan("大椿");Lazyman lazyman1 = new Lazyman("張三");Lazyman lazyman2 = new Lazyman("李四");Lazyman lazyman3 = new Lazyman("王五");toolman.DownStair(); // 工具人大椿下樓了Console.WriteLine("========");toolman.downStairDelegate += lazyman1.TakeFood;toolman.downStairDelegate += lazyman1.TakePackage;toolman.downStairDelegate += lazyman2.TakePackage;toolman.downStairDelegate += lazyman3.PrintFile;toolman.DownStair();// 工具人大椿下樓了// 給張三帶盒飯// 給張三拿快遞// 給李四拿快遞// 給王五打印文件Console.WriteLine("========");toolman.downStairDelegate -= lazyman1.TakePackage;toolman.DownStair();// 工具人大椿下樓了// 給張三帶盒飯// 給李四拿快遞// 給王五打印文件出現問題//Console.WriteLine("========");//toolman.downStairDelegate = lazyman1.TakeFood; // 直接賦值后其他對象全部消失//toolman.DownStair();工具人大椿下樓了給張三帶盒飯//Console.WriteLine("========");//toolman.downStairDelegate(); // 可直接調用downStairDelegate(),此時張三未下樓。給張三帶盒飯// 解決辦法:使用event事件}}