事件本质:类型安全的多播委托
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 AssembliesMicrosoftFramework.NETFrameworkv4.5mscorlib.dll #endregion using 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+"播放完了"); }
反编译:
可见其本质是委托,类型安全的委托