事件本质:类型安全的多播委托
1:还是以音乐播放器为例
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;namespace 事件本质{ class Program { static void Main(string[] args) { } //音乐播放器--类 public class PlayMusic { //构造函数 public PlayMusic(string name) { this.name = name; } //字段-name private string name; //-属性 public string Name { get { return name; } set { name = value; } } //方法--播放 public void PlaySong() { Console.WriteLine("现在开始播放:{0}",this.name); Thread.Sleep(3000); //播放完成执行事件 } } }}
2:那么事件该怎么写呢
2.1 声明事件 public event EventHandler evtPlayOver;这里我们使用系统的委托EventHandler
#region 程序集 mscorlib.dll, v4.0.0.0// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll#endregionusing System.Runtime.InteropServices;namespace System{ // 摘要: // 表示将处理不包含事件数据的事件的方法。 // // 参数: // sender: // 事件源。 // // e: // 不包含任何事件数据的 System.EventArgs。 [Serializable] [ComVisible(true)] public delegate void EventHandler(object sender, EventArgs e);}
2.2 播放完成触发事件
//播放完成执行事件 if (evtPlayOver!=null) { EventArgs e = new EventArgs (); //执行事件 evtPlayOver(this,e); }
3 Main调用PlaySong方法
static void Main(string[] args) { PlayMusic pm = new PlayMusic("小天狼"); //注册要执行事件 pm.evtPlayOver += pm_evtPlayOver; pm.PlaySong(); } static void pm_evtPlayOver(object sender, EventArgs e) { PlayMusic p = sender as PlayMusic; Console.WriteLine(p.Name+"播放完了"); }
反编译:
可见其本质是委托,类型安全的委托