// 1 委托的聲明、實例化和調用 // 2 委托的意義:解耦 class Program { static void Main(string[] args) { MyDelegateEvent delegateEvent = new MyDelegateEvent(); delegateEvent.Show(); Student student = new Student(); student.SayHi(); Console.ReadKey(); } } // 1.委托本質就是個類 // 2.繼承自System.MulticastDelegate 特殊類-不能被繼承 class MyDelegateEvent { //1. 委托聲明 public delegate void NoReturnNopara(); public delegate void NoReturnWithPara(int x, int y); public delegate MyDelegateEvent WithReturnWithPara(out int x, ref int y); public void Show() { //2.委托的實例化 要求傳遞一個參數類型 返回值類型跟委托一致 NoReturnNopara method = new NoReturnNopara(this.DoNothing); //WithReturnWithPara withPara = new WithReturnWithPara(this.ParaReturn); //int y = 3; //withPara.Invoke(out int x,ref y); //3.委托實例的調用 method.Invoke(); method();//也可以省略掉.Invoke() IAsyncResult asyncResult = method.BeginInvoke(null, null); //啟動一個線程完成計算 //method.EndInvoke(asyncResult);//等待異步調用結束 } public void DoNothing() { Console.WriteLine("this is DoNothing"); } private MyDelegateEvent ParaReturn(out int x, ref int y) { throw new Exception(); } } class Student { public delegate void SayHiDelegate(string name); //自上往下 邏輯解耦 ,方便升級維護 //自下往上 代碼重用,去掉重復代碼 public void SayHi() { SayHiPerfact("王大師", this.China); SayHiPerfact("Tom Hiddleston", this.Britain); SayHiPerfact("蒼井そら", Japan); } /// <summary> /// 相同的東西用一個方法實現,不同的各自去寫,然后通過委托組合 /// </summary> /// <param name="name"></param> /// <param name="method"></param> public void SayHiPerfact(string name, SayHiDelegate method) { Console.WriteLine("我是通用方法");//這里可以寫通用方法 比如寫日志,加異常處理 method.Invoke(name); //執行不同邏輯 } public void China(string name) { Console.WriteLine($"{name},早上好"); } public void Britain(string name) { Console.WriteLine($"{name},Good morning"); } public void Japan(string name) { Console.WriteLine($"{name},おはよう"); } }