步步为营-28-事件本质

事件本质:类型安全的多播委托

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);
                //播放完成执行事件

            }
        }
    }
}
View Code

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
#endregion

using System.Runtime.InteropServices;

namespace System
{
    // 摘要: 
    //     表示将处理不包含事件数据的事件的方法。
    //
    // 参数: 
    //   sender:
    //     事件源。
    //
    //   e:
    //     不包含任何事件数据的 System.EventArgs。
    [Serializable]
    [ComVisible(true)]
    public delegate void EventHandler(object sender, EventArgs e);
}
EventHandler

  2.2 播放完成触发事件

 //播放完成执行事件
                if (evtPlayOver!=null)
                {
                    EventArgs e = new EventArgs ();
                    //执行事件
                    evtPlayOver(this,e);
                }
View Code

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+"播放完了");
        }
View Code

 

反编译:

可见其本质是委托,类型安全的委托

posted @ 2017-04-21 16:50  逍遥小天狼  阅读(160)  评论(0编辑  收藏  举报