跳到正文

【C#进阶】事件和委托的区别

委托的特点:不管在哪都可以调用!(委托不安全) 委托与事件的区别: 委托可以看做是一种类型,可以在任意位置调用,因此是不安全的;(委托是用来给函数占位的,不知道到底要调用哪一个函数!) 事件本质上是一种【类型安全】的委托;功能上:1.只能通过+= -=来调用 2.只能在类的内部来调用 实际案例: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApp1 { class Class18 { //委托的特点:不管在哪都可以调用!(委托不安全) /* 委托与事件的区别: 委托可以看做是一种类型,可以在任意位置调用,因此是不安全的;(委托是用来给函数占位的,不知道到底要调用哪一个函数!) 事件本质上是一种【类型安全】的委托;功能上:1.只能通过+= -=来调用 2.只能在类的内部来调用 */ static void Main(string args) { PlayMusic p = new PlayMusic("12121"); // 注册要执行的事件 p.DelPlayOver += P_DelPlayOver; //在类的外部可以注册这个事件,但是我们不能执行这个事件的! //p.DelPlayOver(this, new EventArgs()); error:该事件只能通过+=, 或者-= 来调用! //然后开始播放 p.PlaySongs(); Console.ReadKey(); } //事件需要执行的函数(也就是委托所指向的函数) private static void P_DelPlayOver(object sender, EventArgs e) { //触发的事件源就是PlayMusic PlayMusic p = sender as PlayMusic; Console.WriteLine(p.Name + "播放完毕!"); } } class PlayMusic { public event EventHandler DelPlayOver; //注册事件 public string Name { get; set; } public PlayMusic(string name) { this.Name = name; } //播放音乐 public void PlaySongs() { int i = 1; try { while (i <= 3) { Console.WriteLine("正在播放{0}, 已经播放了{1}次", this.Name, i); i++; Thread.Sleep(1000); } if (DelPlayOver != null) { //调用我的事件 EventArgs e = new EventArgs(); //事件只能在类的内部来调用,更安全些! DelPlayOver(this, e); } } catch (Exception) { throw; } } } }

评论

填写昵称与邮箱即可评论,无需登录。

推荐阅读