在C#中,所谓event事件,就是一种特殊的委托。如果要声明事件,首先就要声明一个相对应的委托类型。按照流程来说,事件相当于委托类型往上升了一级似的,我是这样认为的。

        //1.先声明委托类型
        public delegate void MethodDel(string param);
        //2.再次声明事件
        public event MethodDel DoEvent;

event事件是一种特殊的多播委托,它可以用+=来新增方法引用,也可以用-=移除方法引用。

            //用lambda表达式 附加
            p.DoEvent += param => { Console.WriteLine(param); };

            //用匿名函数 附加
            p.DoEvent += delegate(string param) { Console.WriteLine(param); };

            //用自定义方法 附加
            p.DoEvent += Print;

            //移除Print方法
            p.DoEvent -= Print;

           public static void Print(string param) {
            Console.WriteLine(param);
           }

在用匿名函数或lambda表达式附加方法的时候,如果后面有逻辑需要移除这些方法,在起始附加的时候,就要用委托变量去装载这些方法。

 

在使用event事件的时候,它给我的一个非常深的印象就是层层调用或引用。本来从A点可以直线的方式奔到B点,但是有了事件,可以从A点奔到C点,C点奔到D点,再从D点奔到B点,转了一大圈,最后费了大把气力,终于引用到了需要被调用的方法。而传到该方法的参数,在中途已经被折腾过N遍,该方法可以直接获取这些参数的值。

事件是个好东西,它可以将外部自定义的方法引入到其他已经被封装好的方法中,而这些被封装好的方法可以不用去管你外部自定义方法的实现过程,它也没精力去管。

            public void Show(string param) {
                OnDoEvent(param);
            }

            //调用事件
            protected virtual void OnDoEvent(string param) {
                if(DoEvent != null) {
                    DoEvent(param);
                }
            }

            //---------------------------------
           //用自定义方法 附加
            p.DoEvent += Print;

            p.Show("parameter");

 

 posted on 2016-11-11 18:28  F风  阅读(1490)  评论(0编辑  收藏  举报