一:利用委托實現的例子:
//定義一個委托類型 public delegate void DoSthDelegate1(); ///主程序:/// 蘋果mp3播放器 /// class iPod { //在iPod類中定義一個委托變量 public DoSthDelegate1 userDo; public void PlayMusic() { Console.WriteLine("開始播放音樂.....^^^^^^^^^^^^^^^^^^^^^^^^^........"); if (userDo != null) { //當一開始播放音樂就觸發userDo()這個動作。 調用委托變量 而委托變量的具體賦值是在主程序中 userDo(); } Console.WriteLine("開始播放音樂.....#########################........."); } public void Stop() { Console.WriteLine("停止播放."); //userDo(); } public void Next() { Console.WriteLine("播放下一首..."); } }
static void Main(string[] args) { #region 通過委托來實現的 iPod pod = new iPod(); pod.userDo = BlinkBackground; //調用音樂開始播放的方法。 pod.PlayMusic(); //可以隨意將之前用戶已經綁定的方法給覆蓋掉。 //pod.userDo = ShowLrc; //明明沒有播放音樂,卻可以觸發userDo。 這裡就是冒充了發生 因此引入了事件 //pod.userDo(); #endregion static void ShowLrc() { Console.WriteLine("今天是個好日子,.今天是個好日子,今天是個好日子,今天是個好日子,........."); } static void BlinkBackground() { Console.WriteLine("閃閃閃....."); } }
二:通過事件來實現
//定義一個委托。 public delegate void DoSthDelegate2(); class iPod2 { //定義了一個事件。 //定義事件的時候必須通過委托,沒有委托就無法定義事件。 public event DoSthDelegate2 MusicPlaying; public void PlayMusic() { Console.WriteLine("開始播放音樂.....^^^^^^^^^^^^^^^^^^^^^^^^^........"); if (MusicPlaying != null) { //依然是在音樂開始播放的時候觸發了該動作。 調用事件變量 MusicPlaying(); } Console.WriteLine("開始播放音樂.....#########################........."); } public void Stop() { Console.WriteLine("停止播放."); } public void Next() { Console.WriteLine("播放下一首..."); } }主程序:
static void Main(string[] args) { #region 通過事件來實現的效果 iPod2 pod2 = new iPod2(); //事件不能用=直接賦值,也就避免了通過=將前面的所有內容直接覆蓋掉。 pod2.MusicPlaying += new DoSthDelegate2(BlinkBackground); pod2.PlayMusic(); //事件不能再類外部觸發,只能在類內部觸發 //避免了向委托一樣,在外部冒充事件觸發。 這樣直接調用是不可能的 // pod2.MusicPlaying(); pod2.MusicPlaying += new DoSthDelegate2(pod2_MusicPlaying); //添加事件 pod2.MusicPlaying -= pod2_MusicPlaying; //刪除事件 #endregion Console.ReadKey(); } static void pod2_MusicPlaying() { throw new NotImplementedException(); } static void ShowLrc() { Console.WriteLine("今天是個好日子,.今天是個好日子,今天是個好日子,今天是個好日子,........."); } static void BlinkBackground() { Console.WriteLine("閃閃閃....."); } }
1.“委托”是一種數據類型,他可以存儲的是方法。
2.“事件”是一個對象,可以理解為對委托變量的封裝,事件的內部用的是委托實現的。
3.事件被編譯成為一個add_method()和remove_method()方法和一個私有的委托變量。
4.定義的事件變量不可以在所定義類的外部調用,防止了再外部冒充事件的觸發。
5.委托的作用其實是用來占位的,使用一個委托變量來代替方法的調用,在實際調用之前需要給委托變量賦值,否則為null。
6.事件的作用與委托一樣,只是在功能上比委托變量有更多的限制。