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

    总结 : C#事件理解

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

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

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

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

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

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

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

    而事件的本质是:

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

    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、事件就是封装了一个私有的委托,事件的促发其实就相当于私有委托的调用,所以事件的促发只能是类的内部。

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

    作者:宋桓公 
    出处:http://www.cnblogs.com/douzi2/ 
    如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    微信公众号开发的时候code失效的问题
    微信公众平台测试号通过网页授权获取用户的信息
    做了一些mysql的习题 感觉用来应付面试是足够了
    springMVC在使用重定向跳转
    jsp获取标签数据
    再来一次atm机 用文本做的
    django mysql数据库配置
    django url控制器
    django初始要做的事情
    flask学习
  • 原文地址:https://www.cnblogs.com/grj001/p/12224340.html
Copyright © 2011-2022 走看看