C#--事件溫習
阿新 • • 發佈:2018-12-09
當我們反編譯例子的源程式的時候,我們可以發現事件內部就是一個private的委託和add、remove兩個方法, 在add_Say_EventHandler()方法內部,實際上呼叫了System.Delegate的Combine()靜態方法,這個方法用於將當前的變數新增到委託連結串列中。
事件的一個比較直觀的例子程式:
//事件傳送者 class Dog { //1.宣告關於事件的委託; public delegate void AlarmEventHandler(object sender, EventArgs e); //2.宣告事件; public event AlarmEventHandler Alarm; //3.編寫引發事件的函式; public void OnAlarm() { if (this.Alarm != null) { Console.WriteLine("\n狗報警: 有小偷進來了,汪汪~~~~~~~"); this.Alarm(this, new EventArgs()); //發出警報 } } } //事件接收者 class Host { //4.編寫事件處理程式 void HostHandleAlarm(object sender, EventArgs e) { Console.WriteLine("主人: 抓住了小偷!"); } //5.註冊事件處理程式 public Host(Dog dog) { dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm); } } //6.現在來觸發事件 class Program { static void Main(string[] args) { Dog dog = new Dog(); Host host = new Host(dog); //當前時間,從2008年12月31日23:59:50開始計時 DateTime now = new DateTime(2015, 12, 31, 23, 59, 50); DateTime midnight = new DateTime(2016, 1, 1, 0, 0, 0); //等待午夜的到來 Console.WriteLine("時間一秒一秒地流逝... "); while (now < midnight) { Console.WriteLine("當前時間: " + now); System.Threading.Thread.Sleep(1000); //程式暫停一秒 now = now.AddSeconds(1); //時間增加一秒 } //午夜零點小偷到達,看門狗引發Alarm事件 Console.WriteLine("\n月黑風高的午夜: " + now); Console.WriteLine("小偷悄悄地摸進了主人的屋內... "); dog.OnAlarm(); Console.ReadLine(); } }