委托实现音乐播放器 | 委托实现音乐播放器的缺点 | 事件实现音乐播放器

来源:互联网 发布:卡盟官网源码带后台 编辑:程序博客网 时间:2024/06/07 20:43

//------使用委托实现一个音乐播放器的功能呢。(模拟事件)-------//

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;  //事件相对委托的声明,其实就是多了一个event的关键字而已,用法也是一样的        //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(); //音乐播放完毕            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();        }    }}

我们发现,我们不能搞破坏了。如果不按下播放按钮,音乐就不会开始。 也不会出现没有播放音乐就出现加载歌词,加载动感音符这种不合理的事情了



0 0
原创粉丝点击