事件的學習例子
阿新 • • 發佈:2018-11-19
1.利用委託實現事件例子
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { MusicPlayer mp3= new MusicPlayer(); mp3.AfterStartedPlay = () => { Console.WriteLine("載入歌詞!!!"); Console.WriteLine("載入動感背景"); }; mp3.StartPlay();//播放音樂 mp3.BeforeMusicStop = ()=>{ Console.WriteLine("刪除歌詞!!!!"); Console.WriteLine("停止動感背景!!!"); }; mp3.EndMusic();//停止音樂 //mp3.AfterStartedPlay(); //mp3.BeforeMusicStop();//當把播放音樂mp3.StartPlay();和停止播放音樂mp3.EndMusic();註釋,還是可以呼叫AfterStartedPlay();BeforeMusicStop();顯然是不合理的。Console.WriteLine("ok"); Console.ReadKey(); } } class MusicPlayer { public Action AfterStartedPlay;//定義一個AfterStartedPlay委託 public Action BeforeMusicStop;//定義一個BeforeMusicStop委託 private void PlayMusic() { Console.WriteLine("開始播放音樂。。。。。"); } public void StartPlay() { PlayMusic(); if (AfterStartedPlay != null) { AfterStartedPlay();//播放音樂後要做的事 } Thread.Sleep(2000); } public void EndMusic() { if (BeforeMusicStop != null) { BeforeMusicStop();//播放音樂完之前要做的事 } Console.WriteLine("音樂播放完畢!"); } } }
2.使用事件實現
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { MusicPlayer mp3 = new MusicPlayer(); mp3.AfterStartedPlay += new Action(AfterStartedPlay); mp3.StartPlay(); mp3.BeforeMusicStop += new Action(BeforeMusicStop); //事件在外部不能直接呼叫 //事件只能在定義事件的類的內部來觸發 //mp3.AfterStartedPlay();//報錯 // mp3.BeforeMusicStop();//報錯 mp3.EndMusic(); Console.WriteLine("ok"); Console.ReadKey(); } static void AfterStartedPlay() { Console.WriteLine("載入歌詞!!!"); Console.WriteLine("載入動感背景"); } static void BeforeMusicStop() { Console.WriteLine("刪除歌詞!!!!"); Console.WriteLine("停止動感背景!!!"); } } class MusicPlayer { public event Action AfterStartedPlay;//宣告事件與宣告委託變數特別像,就是在宣告委託變數的前面加一個event關鍵字 public event Action BeforeMusicStop;//當加了event關鍵字後,委託變數就變成了一個事件。 private void PlayMusic() { Console.WriteLine("開始播放音樂。。。。。"); } public void StartPlay() { PlayMusic(); //事件的觸發和呼叫的時候與委託變數的使用一模一樣 if (AfterStartedPlay != null) { AfterStartedPlay(); } Thread.Sleep(2000); } public void EndMusic() { if (BeforeMusicStop != null) { BeforeMusicStop(); } Console.WriteLine("音樂播放完畢!"); } } }