• 事件


    一、简介

    //为什么要有事件?首先说说委托的不足,比如把委托对象在类中声明为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("加载歌词。。。。。");
            }
    

      

  • 相关阅读:
    python 报错 AttributeError: 'Series' object has no attribute 'as_matrix'
    python 报错 NameError: name 'xrange' is not defined
    python报错 AxisError: axis 0 is out of bounds for array of dimension 0
    Python 列表中的浅拷贝与深拷贝
    python列表中查找元素
    Python中两个变量交换
    Python中*和**的使用
    Airtest启动报错:ERROR:gup_process_transport_factory.cc<1019>] Lost UI share context
    adb的使用
    Python函数
  • 原文地址:https://www.cnblogs.com/entclark/p/7967879.html
Copyright © 2020-2023  润新知