1. 程式人生 > 其它 >委託和事件

委託和事件

class Program
    {
        public delegate void CatcallEventHandler();
        public delegate void mouserunEventHandler();

        //貓這個類裡宣告一個事件 (事件是需要委託的)
        //事件的觸發是需要Invoke
        public class Cat
        {
            //事件要依靠 委託  事件在類中宣告且生成
            public event CatcallEventHandler catcall;
            
public void OncatCall() { Console.WriteLine("貓叫了一聲"); catcall.Invoke();//這個Invoke是事件的呼叫 } } public class Mouse { public event mouserunEventHandler mousecall; public void MouseRun() { Console.WriteLine(
"老鼠跑了"); mousecall.Invoke(); } } public class People { //定義主人醒來方法 public void WakeUp() { Console.WriteLine("主人醒了"); } } static void Main(string[] args) { Cat cat
= new Cat(); Mouse m = new Mouse(); People p = new People();
//catcall 是事件,是貓的這個事件引發下一個事件 cat.catcall += new CatcallEventHandler(m.MouseRun); //因為在這裡 觸發了m.MouseRun 而且m.MouseRun又觸發了 mousecall.Invoke(); 然後又觸發了下面的p.wake //這就是為什麼老鼠跑了,主人醒了 m.mousecall += new mouserunEventHandler(p.WakeUp); cat.OncatCall(); m.MouseRun(); Console.ReadKey(); } }
 static void Main(string[] args)
        {
            TestA a = new TestA();
            TestB b = new TestB(a);
            //5.事件的觸發:在程式碼中就是a.Do("a", "b");這一句。通過程式碼發現,a.Do("a", "b")實際上是呼叫了物件b中的OnGetStr方法,
            //所謂的事件“訂閱”相當於是把符合委託“模板”的方法OnGetStr傳遞過去,最終執行的是OnGetStr方法。這樣的語言描述可能不準確,得多體會才行。
            a.Do("a", "b");//事件的觸發
            Console.ReadKey();
        }


        //1.首先定義一個委託型別:void GetStrHandler(string x, string y),為事件的宣告作準備。
        public delegate void GetStrHander(string x, string y);
        //2.定義事件擁有者的類,即class TestA,事件擁有者是這個類的例項物件即TestA a = new TestA();中定義的a。
        //因為事件GetStr,是在TestA這個類中定義的,也就是事件的擁有者。
        public class TestA
        {
            //事件型別與委託一起  GetStr最終還是一個事件,閃電符號
            //宣告事件
            public event GetStrHander GetStr;
            public void Do(string x, string y)
            {
                GetStr(x, y);
            }
        }

        //3..定義事件訂閱者的類,即class TestB ,事件擁訂閱者是這個類的例項物件即TestB b = new TestB(a);中定義的b,
        //仔細看看TestB的構造方法,發現它依賴於物件a,這是因為訂閱者需要監聽事件擁有的事件(這句的"監聽"也就是當TestA有啥動靜,這邊及時作出反應),
        //因此需要把事件擁有者“引”進來,使訂閱者能實現事件訂閱
        public class TestB
        {
            private TestA _A;
            public TestB(TestA a)
            {
                _A = a;
                _A.GetStr += OnGetStr;//事件的訂閱
                _A.GetStr += onGetStr2;//後面再追加一個訂閱,也就是多播委託
            }
            //4.定義事件處理方法:在三要素中已強調過,事件處理方法是在訂閱者中定義的,表示事件觸發時需要執行的方法。
            //這裡就是執行了“Console.WriteLine(string.Format("{0}+{1}", x, y));”這個動作。
            private void OnGetStr(string x, string y)
            {
                Console.WriteLine(string.Format("{0}+{1}", x, y));
            }

            public void onGetStr2(string x, string y)
            {
                Console.WriteLine(string.Format("{0}-{1}", x, y));
            }
        }
人各有命,上天註定,有人天生為王,有人落草為寇。腳下的路,如果不是你自己的選擇,那麼旅程的終點在哪,也沒人知道。你會走到哪,會遇到誰,都不一定。