一、简介
//为什么要有事件?首先说说委托的不足,比如把委托对象在类中声明为private会怎样。 结果就是:委托变得毫无意义。声明委托的目的就是为了把它暴露在类的客户端进行方法注册,把它声明为private了,客户端对它根本就不可见。再看看把委托声明为public会怎样。 结果就是:在客户端可以对它进行随意的赋值等操作,破坏了对象的封装性。 这就好像类中包含一个字段string name时,如果需要对它进行访问,通常并不会直接将name字段声明为public,而是添加一个公共属性public string Name{get{return name;}} ;事件:它封装了委托类型的变量,相当于为委托类型量身定制的属性. 使得:在类的内部,不管声明它是public还是protected,它总是private的(反编译也可以看出)。 //在类的外部,只能注册“+=”和注销“-=”的访问限定符与声明事件时使用的访问限定符相同 ,不能使用
二、委托事件也是为了多态化。简单示例委托与事件的不同,都是委托变量,但是委托变量前面加一个event
委托实现:
public class MusicPlayer { //委托实现 //1.音乐开始播放后触发某个事件 public Action AfterStartedPlay; ////2.音乐停止播放之前触发某个事件 public Action BeforeMusicStop; //事件实现 //1.音乐开始播放后触发某个事件 // public event Action AfterStartedPlay; //2.音乐停止播放之前触发某个事件 //public enent Action BeforeMusicStop; private void PlayMusic() { Console.WriteLine("开始播放音乐......"); } /// <summary> /// 按下【播放】按钮实现播放音乐 /// </summary> public void StartPlay() { PlayMusic(); //当音乐开始播放以后触发该事件。 if (AfterStartedPlay != null) { AfterStartedPlay(); } Thread.Sleep(2000); } /// <summary> /// 音乐播放完毕! /// </summary> public void EndMusic() { //在音乐播放结束之前 if (BeforeMusicStop != null) { BeforeMusicStop(); } Console.WriteLine("音乐播放完毕!!"); } }
MusicPlayer mp3 = new MusicPlayer(); mp3.AfterStartedPlay = () => { Console.WriteLine("加载歌词!!!"); Console.WriteLine("加载动感背景!!!!"); }; mp3.BeforeMusicStop = () => { Console.WriteLine("删除歌词!!!!!!"); Console.WriteLine("停止动感背景!!!!!"); }; //委托可以用=直接赋值,可以将以前“注册”的方法都覆盖掉。 mp3.AfterStartedPlay = null; mp3.BeforeMusicStop = null; mp3.StartPlay(); mp3.EndMusic(); //因为是用委托来实现的,所以在外部可以随意调用触发 //此时,不能将委托变成private的,如果改成私有的,则也无法为委托变量赋值了。 //mp3.AfterStartedPlay(); //mp3.BeforeMusicStop(); Console.WriteLine("ok"); Console.ReadKey();
事件实现:
MusicPlayer mp3 = new MusicPlayer(); mp3.AfterStartedPlay += new Action(mp3_AfterStartedPlay); mp3.BeforeMusicStop += new Action(mp3_BeforeMusicStop); //mp3.StartPlay(); //mp3.EndMusic(); ////事件在外部不能直接调用。。 ////事件只能在定义事件的类的内部来触发。 //mp3.AfterStartedPlay(); //mp3.BeforeMusicStop(); Console.ReadKey(); //上面注册的2个方法 static void mp3_BeforeMusicStop() { Console.WriteLine("删除歌词...."); } static void mp3_AfterStartedPlay() { Console.WriteLine("加载歌词。。。。。"); }