委託和事件
阿新 • • 發佈:2021-07-22
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)); } }人各有命,上天註定,有人天生為王,有人落草為寇。腳下的路,如果不是你自己的選擇,那麼旅程的終點在哪,也沒人知道。你會走到哪,會遇到誰,都不一定。