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

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

时间: 2024-10-25 16:01:12

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

从click事件理解DOM事件流

事件流是用来解释页面上的不同元素接受一个事件的顺序,首先要明确两点: 1.一个事件的影响元素可能不止一个(同心圆理论),但目标元素只有一个. 2.如果这些元素都绑定了相同名称的事件函数,我们怎么知道这些函数的运行顺序?于是有了事件流的概念(事件捕捉,事件冒泡) 举个例子: <div id="outer"> <p id="inner">Click me!</p> </div> 为了看起来方便,先无视CSS样式,那么蓝色的

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

OC中的协议(Protocol)和和.NET中的接口(Interface)类似,简单来讲,就是一系列方法的列表,其中声明的方法可以被任何类实现.不同的是,在.NET中,如果某个类实现了一个接口,就必须实现这个接口中声明的所有方法:但在OC中,可以不实现协议中声明的所有方法,需要用到某些功能,就去实现对应的方法即可. 这种模式一般称为代理模式.在iOS和OS X开发中,Apple采用了大量的代理模式来实现MVC中View(UI控件)和Controller(控制器)的解耦. 监听思想:如果想让某个对

js事件事件理解

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>js事件流模型</title> </head> <style> #con{ width:200px; height:200px; background: orange; } #outer{ positio

事件理解及初识

类或对象可以通过事件向其他类或对象通知发生的相关事情 发行者确定何时引发事件,订户确定执行何种操作来响应该事件. C#中的事件处理实际上是一种具有特殊签名的delegate 假设一个场景 :老师登记分数后,学生马上接收到分数 发布者首先要写的代码 1.定义一个委托和事件,写一个方法,当这个方法调用时触发事件通知订阅者 public class Teacher { public delegate void TellScoreEventHandler(object sender, ScoreEven

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

一:什么是事件     事件是可以被控件识别的操作,如按下确定按钮,选择某个单选按钮或者复选框.每一种控件有自己可以识别的事件,如窗体的加载.单击.双击等事件,编辑框(文本框)的文本改变事件,等等.事件在桌面应用程序里面无处可见,比如winform,WPF...,其次事件是基于委托而产生的. 二:事件的基本使用 1.事件的声明: 其实和委托一样只是多了一个Event而已.ShowMsg 就具备了ShowMsgHandler的功能. Notes: 1. 委托可以依赖于一个类或者一个域名空间(C#基

C# 关于事件的一些心得

使用事件 定义和发布事件 事件是建立在委托的基础上的,当某类发生某一事情后,可以通过事件机制通知已经注册的类或对象正在发生的事情,然后这些类或对象做出响应. 事件的本质是委托,但它通常是特定的函数类型,可以将事件理解为委托变量,订阅事件就是为委托变量赋值,同样也是使用“+=”/“-=”. 在定义事件之前要先定义委托,只不过这个委托是特定的函数类型,它没有返回值,并且具有两个参数sender和arg. 例如: Public delegate void PriceChangedEventHandle

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

我们依据上一次介绍的触屏事件和事件队列等知识来实现触屏的单击,双击,三连击事件. 下图为我们实现的效果图: 单击精灵跳跃一个高度, 双击精灵跳跃的高度比单击的高 三连击精灵跳跃的跟高 好了.開始动手吧. 新建项目.删除多余的代码 接着在Classes文件夹下建立两个文件,这里我就命名为Human了 (在Classes上右键加入新建项,选择头文件,名称Human.h,位置浏览到Classes文件夹下) 由于要实现精灵能接受触屏事件,所以我们不能用CCSprite ,须要自己写个类继承CCSprit

JS事件用法

1.常用事件理解 onfocus/onblur:聚焦离焦事件,用于表单校验的时候比较合适. onclick/ondblclick:鼠标单击和双击事件 onkeydown/onkeypress:搜索引擎使用较多 onload:页面加载事件,所有的其它操作(匿名方式)都可以放到这个绑定的函数里面去.如果是有名称,那么在html页面中只能写一个. onmouseover/onmouseout/onmousemove:购物网站商品详情页. onsubmit:表单提交事件 ,有返回值,控制表单是否提交(只

C#_event_事件

//-------------------事件--------------------------- 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace _01事件理解 8 { 9 class Program 10 { 11 static void Main(string