标签:委托
1,使用委托实现一个音乐播放器的功能呢。(模拟事件)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace 模拟事件 { /// <summary> /// 音乐播放器类 /// </summary> public class MusicPlayer { //1.音乐开始后触发某些事件 public Action AfterPlayMusic; //2.音乐停止前触发某些事件 public Action BeforeEndMusic; /// <summary> /// 开始播放音乐 /// </summary> private void PlayMusic() { Console.WriteLine("开始播放音乐"); } /// <summary> /// 按下【播放】按钮实现播放音乐 /// </summary> public void StartPlay() { PlayMusic(); if (AfterPlayMusic != null) //音乐开始播放后,判断这个委托是否为空,如果不为空就执行一些事件 { AfterPlayMusic(); //这里就相当于一个事件 } Thread.Sleep(3000);//让系统睡3秒钟(音乐播放时间) } /// <summary> /// 音乐播放完毕 /// </summary> public void EndMusic() { if (BeforeEndMusic != null) //音乐播放完毕之前,判断这个委托是否为空,如果不为空就执行一些事件 { BeforeEndMusic(); } Console.WriteLine("音乐播放完毕!"); } } //------------------------------------------------------------------// class Program { static void Main(string[] args) { //现在我们来使用这个音乐播放器类 MusicPlayer mp3 = new MusicPlayer(); //给委托赋值 mp3.AfterPlayMusic = () => { Console.WriteLine("加载歌词!"); Console.WriteLine("加载动感音符!"); }; //给委托赋值 mp3.BeforeEndMusic = () => { Console.WriteLine("删除歌词!"); Console.WriteLine("停止动感音符!"); }; mp3.StartPlay(); //按下播放按钮, mp3.EndMusic(); //音乐播放完毕 Console.ReadKey(); } } }
//-------------------但是这个委托实现音乐播放器也有很大的缺点,下面我们来看看改了最后一点点的代码---------------------------//
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace 模拟事件 { /// <summary> /// 音乐播放器类 /// </summary> public class MusicPlayer { //1.音乐开始后触发某些事件 public Action AfterPlayMusic; //2.音乐停止前触发某些事件 public Action BeforeEndMusic; /// <summary> /// 开始播放音乐 /// </summary> private void PlayMusic() { Console.WriteLine("开始播放音乐"); } /// <summary> /// 按下【播放】按钮实现播放音乐 /// </summary> public void StartPlay() { PlayMusic(); if (AfterPlayMusic != null) //音乐开始播放后,判断这个委托是否为空,如果不为空就执行一些事件 { AfterPlayMusic(); //这里就相当于一个事件 } Thread.Sleep(3000);//让系统睡3秒钟(音乐播放时间) } /// <summary> /// 音乐播放完毕 /// </summary> public void EndMusic() { if (BeforeEndMusic != null) //音乐播放完毕之前,判断这个委托是否为空,如果不为空就执行一些事件 { BeforeEndMusic(); } Console.WriteLine("音乐播放完毕!"); } } //------------------------------------------------------------------// class Program { static void Main(string[] args) { //现在我们来使用这个音乐播放器类 MusicPlayer mp3 = new MusicPlayer(); //给委托赋值 mp3.AfterPlayMusic = () => { Console.WriteLine("加载歌词!"); Console.WriteLine("加载动感音符!\n\n"); }; //给委托赋值 mp3.BeforeEndMusic = () => { Console.WriteLine("删除歌词!"); Console.WriteLine("停止动感音符!"); }; //现在我想搞点破坏....我不执行下面两段代码了 //mp3.StartPlay(); //按下播放按钮, //mp3.EndMusic(); //音乐播放完毕 //既然我在上面给AfterPlayMusic和BeforeEndMusic这两个委托已经赋值了。我这里就直接执行这两个委托 mp3.AfterPlayMusic(); mp3.BeforeEndMusic(); Console.ReadKey(); } } }
//-----------------------------------下面我们来看看使用事件实现音乐播放器的时候,看我们能不能再搞破坏了--------------------//
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace 模拟事件 { /// <summary> /// 音乐播放器类 /// </summary> public class MusicPlayer { //1.音乐开始后触发某些事件 public event Action AfterPlayMusic; //2.音乐停止前触发某些事件 public event Action BeforeEndMusic; /// <summary> /// 开始播放音乐 /// </summary> private void PlayMusic() { Console.WriteLine("开始播放音乐"); } /// <summary> /// 按下【播放】按钮实现播放音乐 /// </summary> public void StartPlay() { PlayMusic(); if (AfterPlayMusic != null) //音乐开始播放后,判断这个委托是否为空,如果不为空就执行一些事件 { AfterPlayMusic(); //这里就相当于一个事件 } Thread.Sleep(3000);//让系统睡3秒钟(音乐播放时间) } /// <summary> /// 音乐播放完毕 /// </summary> public void EndMusic() { if (BeforeEndMusic != null) //音乐播放完毕之前,判断这个委托是否为空,如果不为空就执行一些事件 { BeforeEndMusic(); } Console.WriteLine("音乐播放完毕!"); } } //------------------------------------------------------------------// class Program { static void Main(string[] args) { //现在我们来使用这个音乐播放器类 MusicPlayer mp3 = new MusicPlayer(); //给委托赋值 mp3.AfterPlayMusic += () => { Console.WriteLine("加载歌词!"); Console.WriteLine("加载动感音符!\n\n"); }; //给委托赋值 mp3.BeforeEndMusic += () => { Console.WriteLine("删除歌词!"); Console.WriteLine("停止动感音符!"); }; //现在我想搞点破坏....我不执行下面两段代码了 //mp3.StartPlay(); //按下播放按钮, //mp3.EndMusic(); //音乐播放完毕 //既然我在上面给AfterPlayMusic和BeforeEndMusic这两个事件已经赋值了。我这里就直接执行这两个事件 //mp3.AfterPlayMusic(); //发现直接执在MusicPlayer类外面执行MusicPlayer类的AfterPlayMusic事件报错了 //mp3.BeforeEndMusic(); //发现直接执在MusicPlayer类外面执行MusicPlayer类的BeforeEndMusic事件报错了 //最后我们得出结论: //1.当在一个类的内部定义了一个事件,那么事件在定义事件的类的外部不能直接调用 //2.当在一个类的内部定义了一个事件,那么事件只能在定义事件的类的内部触发(调用) Console.ReadKey(); } } }
我们发现,我们不能搞破坏了。如果不按下播放按钮,音乐就不会开始。 也不会出现没有播放音乐就出现加载歌词,加载动感音符这种不合理的事情了
委托实现音乐播放器 | 委托实现音乐播放器的缺点 | 事件实现音乐播放器
标签:委托
原文地址:http://blog.csdn.net/fanbin168/article/details/45753519