总结 : 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、事件就是封装了一个私有的委托,事件的促发其实就相当于私有委托的调用,所以事件的促发只能是类的内部。
而事件的注册往往是在其他的地方!
总结 : C#事件理解的更多相关文章
- C#委托,事件理解入门 (译稿)
原文地址:http://www.codeproject.com/Articles/4773/Events-and-Delegates-Simplified 引用翻译地址:http://www.cnbl ...
- 从click事件理解DOM事件流
事件流是用来解释页面上的不同元素接受一个事件的顺序,首先要明确两点: 1.一个事件的影响元素可能不止一个(同心圆理论),但目标元素只有一个. 2.如果这些元素都绑定了相同名称的事件函数,我们怎么知道这 ...
- Objective-C:模拟按钮点击事件理解代理模式
OC中的协议(Protocol)和和.NET中的接口(Interface)类似,简单来讲,就是一系列方法的列表,其中声明的方法可以被任何类实现.不同的是,在.NET中,如果某个类实现了一个接口,就必须 ...
- 浅谈iOS触摸事件理解
iOS的触摸事件个人总结,分为两步: 第一步:是找到哪个视图上触摸 第二步:分析由谁去响应(响应者连) 1.寻找被触摸的视图原理如下图 hitText:withEvent:的方法处理流程: 首先会在当 ...
- C#事件的理解应用
之前对C#的事件理解的不够透彻,总是感觉在实际应用上差一些火候.最近写character类的相关内容,有了一些理解,在这里分享一下. &感觉大神没必要往下看了 下面开始正式内容: 比如说,角色 ...
- C#基础---事件的使用
一:什么是事件 事件是可以被控件识别的操作,如按下确定按钮,选择某个单选按钮或者复选框.每一种控件有自己可以识别的事件,如窗体的加载.单击.双击等事件,编辑框(文本框)的文本改变事件,等等.事 ...
- [C# 基础知识系列]专题四:事件揭秘
转自http://www.cnblogs.com/zhili/archive/2012/10/27/Event.html 引言: 前面几个专题对委托进行了详细的介绍的,然后我们在编写代码过程中经常会听 ...
- Cocos2D-X2.2.3学习笔记8(处理精灵单击、双击和三连击事件)
我们依据上一次介绍的触屏事件和事件队列等知识来实现触屏的单击,双击,三连击事件. 下图为我们实现的效果图: 单击精灵跳跃一个高度, 双击精灵跳跃的高度比单击的高 三连击精灵跳跃的跟高 好了,開始动手吧 ...
- [C# 基础知识系列]专题四:事件揭秘 (转载)
引言: 前面几个专题对委托进行了详细的介绍的,然后我们在编写代码过程中经常会听到“事件”这个概念的,尤其是写UI的时候,当我们点击一个按钮后VS就会自动帮我们生成一些后台的代码,然后我们就只需要在Cl ...
随机推荐
- LeetCode题解之N-ary Tree Postorder Traversal
1.题目描述 2.问题分析 递归. 3.代码 vector<int> postorder(Node* root) { vector<int> v; postNorder(roo ...
- 转:在网站开发中很有用的8个 jQuery 效果【附源码】
原文地址:http://www.cnblogs.com/lhb25/p/amazing-jquery-effects.html jQuery 作为最优秀 JavaScript 库之一,改变了很多人编写 ...
- 通过javascript添加一行
<html><head> <title>添加新的行</title></head><body> <div onclick=& ...
- Difference between HashMap and Hashtable | HashMap Vs Hashtable
Both the HashMap and Hashtable implement the interface java.util.Map but there are some slight diffe ...
- MySQL基础之 统计函数总结
五种统计函数:count().max().avg().min().max()函数 count()函数 count()函数在进行计算的时候,是分情况进行计算的,主要是一下两种 1.采用count(*)对 ...
- 第 14 章 结构和其他数据形式(names3)
/*----------------------------------- names3.c -- 使用指针和 malloc() ----------------------------------- ...
- Spring Boot 的 Security 安全控制
Spring Security 是一个强大且高度可定制的身份验证和访问控制框架,完全基于 Spring 的应用程序的标准,Spring Security 为基于 Java EE 的企业应用程序提供了一 ...
- Django商城项目笔记No.9用户部分-注册接口签发JWTtoken
Django商城项目笔记No.9用户部分-注册接口签发JWTtoken 我们在验证完用户的身份后(检验用户名和密码),需要向用户签发JWT,在需要用到用户身份信息的时候,还需核验用户的JWT. 关于签 ...
- ffmpeg常用参数一览表
基本选项: -formats 输出所有可用格式 -f fmt 指定格式(音频或视频格式) -i filename 指定输入文件名,在linux下当然也能指定:0.0(屏幕录制)或摄像头 -y 覆盖已有 ...
- python第四十课——构造函数
1.动态给对象添加属性: 在对象创建完毕后,单独为其添加需要的属性:可以理解为:私人定制 [注意]: 添加的属性只有此对象能够使用,别的对象如果用了,直接报错; 2.构造函数/构造方法/构造器: 格式 ...