• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
【我是谁】
博客园    首页    新随笔    联系   管理    订阅  订阅

事件

一、简介

//为什么要有事件?首先说说委托的不足,比如把委托对象在类中声明为private会怎样。 结果就是:委托变得毫无意义。声明委托的目的就是为了把它暴露在类的客户端进行方法注册,把它声明为private了,客户端对它根本就不可见。再看看把委托声明为public会怎样。 结果就是:在客户端可以对它进行随意的赋值等操作,破坏了对象的封装性。 这就好像类中包含一个字段string name时,如果需要对它进行访问,通常并不会直接将name字段声明为public,而是添加一个公共属性public string Name{get{return name;}} ;事件:它封装了委托类型的变量,相当于为委托类型量身定制的属性. 使得:在类的内部,不管声明它是public还是protected,它总是private的(反编译也可以看出)。
//在类的外部,只能注册“+=”和注销“-=”的访问限定符与声明事件时使用的访问限定符相同 ,不能使用
View Code

二、委托事件也是为了多态化。简单示例委托与事件的不同,都是委托变量,但是委托变量前面加一个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("加载歌词。。。。。");
        }

  

 

posted @ 2017-12-03 23:10  【我是谁】  阅读(150)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3