zoukankan      html  css  js  c++  java
  • 总结 : C#事件理解

    要理解事件,首先必须理解委托!!

    1、如果说委托是一个类型,那么事件就是一个对象!

    2、事件的创建必须是借助某个委托类型来完成的!

    3、也就是说,委托是事件的类型,事件本身是个对象!!

    4、所以,事件也可以看成是一个,受到约束的委托实例(委托对象)。

    我们知道委托存在多播委托:(也就是一个委托可以指向多个方法!)

    clip_image002

    下面这种简写形式,编译器帮我们进行了new!看上去是直接与方法关联,其实还是通过委托!

    clip_image004

    而事件的本质是:

    clip_image006

    所以,事件和方法关联起来的方式,是差不多的:

    this.button1.Click += new System.EventHandler(this.button1_Click);

    过程就是,首先new一个委托实例,这个委托实例通过构造函数,由一个方法初始化。事件再添加这个委托,从而关联这个方法。

    下次,这个事件被促发是,这个方法就会被调用!

    //----------------------进一步理解事件-----------------------------------

    之前我们说,委托的目的是让方法可以做为参数。而事件是将委托的实例进行了封装。那事件的目的是什么呢?

    .NET为我们提供的很多类,类里有属性,方法,以及事件。比如Button类就为我们提供了点击事件。

    当我们点击按钮的时候就会执行下面这段程序对吧:

    private void BtnOpen_Click(object sender, EventArgs e){}

    但是我们要清楚,BtnOpen_Click他并不是事件本身,而是事件注册的方法!

    事件的声明,已经注册,VS已经帮我们完成了:

    public delegate void EventHandler( object sender , EventArgs e )//委托的声明

    public event EventHandler Click; //利用委托定义事件Click,注意格式事件这里不需要签名(返回值,参数值)

    Click += new System.EventHandler(BtnOpen_Click);//为事件注册方法

    VS帮我们做完这些事情之后,就把这个空着的BtnOpen_Click方法丢给我们,让程序员自己来实现方法的具体内容。

    讲到这里,我们再来想想事件的目的是什么?或者说微软那帮人,设计事件这个机制是为啥?也就是说,事件事先

    注册好方法,当事件触发时该方法会被调用,但是该方法具体内容先不管,如果你要用到这个事件的时候,自己去

    实现这个注册了的方法!这样当用户要用到这个类的这个事件时,所以关注的仅仅是这个注册了的方法而已!

    讲到这个里,还有两点是操作系统帮我们完成的,及事件的侦听,以及事件的触发!比如操作系统会侦听这个按钮何时

    会被按下,一旦按键按下就会就会有消息被放到消息队列,当再次采集到这个消息时,事件就会触发,操作系统就会去

    调用BtnOpen_Click方法。并且还会为这个BtnOpen_Click方法传参,(object sender, EventArgs e)sender就是产生

    事件的对象,e包含了事件的一些细节内容。

    //-----------------------------事件和委托的区别------------------------------------

    事件的本质是封装了一个私有的委托,和两个方法。

    这导致了当事件定义到某个类中,它不允许在类的外部被直接触发,只能在类的内部适合的时机触发。

    事件的促发其实就是其中这个私有委托的调用!!虽然说事件只能在类的内部适合的时机触发。

    但是事件可以放到一个公开的方法里,而这个公开的方法可以在外部调用。

    总结:

    1、声明事件之前,需要声明委托,委托一般放在类的外面并且用public修饰!

    public delegate void 委托名(object sender, EventArgs e);

    2、委托声明好了之后就可以利用委托声明事件,此时事件无需标签(返回值,参数值)。

    public event 委托名 事件名; 利用委托定义事件Click,注意格式事件这里不需要签名。

    3、事件就是封装了一个私有的委托,事件的促发其实就相当于私有委托的调用,所以事件的促发只能是类的内部。

    而事件的注册往往是在其他的地方!

  • 相关阅读:
    欧拉回路 定理
    UESTC 1087 【二分查找】
    POJ 3159 【朴素的差分约束】
    ZOJ 1232 【灵活运用FLOYD】 【图DP】
    POJ 3013 【需要一点点思维...】【乘法分配率】
    POJ 2502 【思维是朴素的最短路 卡输入和建图】
    POJ 2240 【这题貌似可以直接FLOYD 屌丝用SPFA通过枚举找正权值环 顺便学了下map】
    POJ 1860【求解是否存在权值为正的环 屌丝做的第一道权值需要计算的题 想喊一声SPFA万岁】
    POJ 1797 【一种叫做最大生成树的很有趣的贪心】【也可以用dij的变形思想~】
    js 实现slider封装
  • 原文地址:https://www.cnblogs.com/douzi2/p/4285289.html
Copyright © 2011-2022 走看看