c#委托的聲明、實例化和調用


  // 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},おはよう");
        }
    }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM