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

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

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

总结 : C#事件理解的更多相关文章

  1. C#委托,事件理解入门 (译稿)

    原文地址:http://www.codeproject.com/Articles/4773/Events-and-Delegates-Simplified 引用翻译地址:http://www.cnbl ...

  2. 从click事件理解DOM事件流

    事件流是用来解释页面上的不同元素接受一个事件的顺序,首先要明确两点: 1.一个事件的影响元素可能不止一个(同心圆理论),但目标元素只有一个. 2.如果这些元素都绑定了相同名称的事件函数,我们怎么知道这 ...

  3. Objective-C:模拟按钮点击事件理解代理模式

    OC中的协议(Protocol)和和.NET中的接口(Interface)类似,简单来讲,就是一系列方法的列表,其中声明的方法可以被任何类实现.不同的是,在.NET中,如果某个类实现了一个接口,就必须 ...

  4. 浅谈iOS触摸事件理解

    iOS的触摸事件个人总结,分为两步: 第一步:是找到哪个视图上触摸 第二步:分析由谁去响应(响应者连) 1.寻找被触摸的视图原理如下图 hitText:withEvent:的方法处理流程: 首先会在当 ...

  5. C#事件的理解应用

    之前对C#的事件理解的不够透彻,总是感觉在实际应用上差一些火候.最近写character类的相关内容,有了一些理解,在这里分享一下. &感觉大神没必要往下看了 下面开始正式内容: 比如说,角色 ...

  6. C#基础---事件的使用

    一:什么是事件     事件是可以被控件识别的操作,如按下确定按钮,选择某个单选按钮或者复选框.每一种控件有自己可以识别的事件,如窗体的加载.单击.双击等事件,编辑框(文本框)的文本改变事件,等等.事 ...

  7. [C# 基础知识系列]专题四:事件揭秘

    转自http://www.cnblogs.com/zhili/archive/2012/10/27/Event.html 引言: 前面几个专题对委托进行了详细的介绍的,然后我们在编写代码过程中经常会听 ...

  8. Cocos2D-X2.2.3学习笔记8(处理精灵单击、双击和三连击事件)

    我们依据上一次介绍的触屏事件和事件队列等知识来实现触屏的单击,双击,三连击事件. 下图为我们实现的效果图: 单击精灵跳跃一个高度, 双击精灵跳跃的高度比单击的高 三连击精灵跳跃的跟高 好了,開始动手吧 ...

  9. [C# 基础知识系列]专题四:事件揭秘 (转载)

    引言: 前面几个专题对委托进行了详细的介绍的,然后我们在编写代码过程中经常会听到“事件”这个概念的,尤其是写UI的时候,当我们点击一个按钮后VS就会自动帮我们生成一些后台的代码,然后我们就只需要在Cl ...

随机推荐

  1. linux下opencv编译

    .tar.gz cd opencv-/ cd .. mkdir my_build_dir cd my_build_dir cmake ../opencv- -DWITH_GTK_2_X=ON -DCM ...

  2. gradle中的compileSdkVersion和buildToolsVersion

    CompileSdkVersion:编译版本,就是运行这个项目需要的SDK,即API Level. buildToolsVerson:是构建工具的版本,构建工具包括了打包工具aapt.dx等等. 注意 ...

  3. API接口安全设计(转)

    接口的安全性主要围绕Token.Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看: Token授权机制:用户使用用户名密码登录后服务器给客户端返回一个To ...

  4. Java 如何启用 ARM 虚拟机诊断

    现象描述 如何通过 Java 语言实现在创建 ARM 虚拟机时开启诊断,并配置相关指标.   实现思路 调研最高版本的 JAVA SDK(1.1.0)源码发现,SDK 层面并未提供任启动诊断和配置诊断 ...

  5. python自学——列表

    #以下是我自己在联系列表中所编写的语句:names=["zangsan",'lisi','wangermazi','Xiaoliuzi','dabiaoge','牛erbiaodi ...

  6. winform中容器是如使用的

    1.容器 (1)FlowLayouPanel 普通容器[内部流式布局] (2)Groupbox 带有标题的普通容器[内部普通布局,超出范围隐藏] (3)Panel 普通容器[内部普通布局,超出范围隐藏 ...

  7. Oracle Database 12c Preinstall Steps for Oracle Linux Simplified

    This post is a quick reminder that Oracle Linux includes a handy RPM to address pre-installation req ...

  8. 中断标志位 IRQF_ONESHOT

    one shot本身的意思的只有一次的,结合到中断这个场景,则表示中断是一次性触发的,不能嵌套.对于primary handler,当然是不会嵌套,但是对于threaded interrupt han ...

  9. yum/dnf/rpm 等 查看rpm 包安装路径 (fedora 中 pygtk 包内容安装到哪里了)

    有时候我们 使用 包管理工具,安装很方便,但我们还要能知道它们安装了什么文件,都把这些文件安装到哪里了? 我们以探究 pygtk 为例 在 fedora 28 之中 查找 pygtk: ➜ ~ rpm ...

  10. windows系统利用任务管理器-资源监视器了解程序的磁盘读写量

    场景摘要:   1.刚部署上线一个新功能,增加了日志输出模块 2.本身服务器资源已经紧张了,在增加日志输出,就想了解磁盘读写量 3.从中突然发现oracle的磁盘读写量比较大 4.在展开明细发现是or ...