C#中委托和事件的区别实例解析
大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。本篇分别通过委托和事件执行多个方法,从中体会两者的区别。
一、通过委托执行方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class Program { static void Main( string [] args) { Example example = new Example(); example.Go(); Console.ReadKey(); } } public class Example { public delegate void DoSth( string str); internal void Go() { //声明一个委托变量,并把已知方法作为其构造函数的参数 DoSth d = new DoSth(Print); string str = "Hello,World" ; //通过委托的静态方法Invoke触发委托 d.Invoke(str); } void Print( string str) { Console.WriteLine(str); } } |
上述代码实现:
① 在CLR运行时,委托DoSth实际上就一个类,该类有一个参数类型为方法的构造函数,并且提供了一个Invoke实例方法,用来触发委托的执行。
②
委托DoSth定义了方法的参数和返回类型
③ 通过委托DoSth的构造函数,可以把符合定义的方法赋值给委托
④
调用委托的实例方法Invoke执行了方法
但实际上让委托执行方法还有另外一种方式,那就是:委托变量(参数列表)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class Example { public delegate void DoSth( object sender, EventArgs e); internal void Go() { //声明一个委托变量,并把已知方法作为其构造函数的参数 DoSth d = new DoSth(Print); object sender = 10; EventArgs e = new EventArgs(); d(sender, e); } void Print( object sender, EventArgs e) { Console.WriteLine(sender); } } |
上述代码实现:
① 委托DoSth的参数列表和方法Print的参数列表还是保持一致
② 委托DoSth中的参数object
sender通常用来表示动作的发起者,EventArgs e用来表示动作所带的参数。
而实际上,委托变量(参数列表),事件就是采用这种形式执行方法的。
二、通过事件执行方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class Example { public delegate void DoSth( object sender, EventArgs e); public event DoSth myDoSth; internal void Go() { //声明一个委托变量,并把已知方法作为其构造函数的参数 DoSth d = new DoSth(Print); object sender = 10; EventArgs e = new EventArgs(); myDoSth += new DoSth(d); myDoSth(sender, e); } void Print( object sender, EventArgs e) { Console.WriteLine(sender); } } |
上述代码实现:
① 声明了事件myDoSth,事件的类型是DoSth这个委托
② 通过+=为事件注册委托
③
通过DoSth委托的构造函数为事件注册委托实例
④ 采用委托变量(参数列表)这种形式,让事件执行方法
而且,通过+=还可以为事件注册多个委托。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public class Example { public delegate void DoSth( object sender, EventArgs e); public event DoSth myDoSth; internal void Go() { //声明一个委托变量,并把已知方法作为其构造函数的参数 DoSth d = new DoSth(Print); DoSth d1 = new DoSth(Say); object sender = 10; EventArgs e = new EventArgs(); //为事件注册多个委托 myDoSth += new DoSth(d); myDoSth += new DoSth(d1); myDoSth(sender, e); } void Print( object sender, EventArgs e) { Console.WriteLine(sender); } void Say( object sender, EventArgs e) { Console.WriteLine(sender); } } |
以上,通过+=为事件注册1个或多个委托实例,实际上,还可以为事件直接注册方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class Example { public delegate void DoSth( object sender, EventArgs e); public event DoSth myDoSth; internal void Go() { object sender = 10; EventArgs e = new EventArgs(); //为事件注册多个委托 myDoSth += Print; myDoSth += Say; myDoSth(sender, e); } void Print( object sender, EventArgs e) { Console.WriteLine(sender); } void Say( object sender, EventArgs e) { Console.WriteLine(sender); } } |
三、通过EventHandler执行方法
先来看EventHandler的源代码。
1
|
public delegate void EventHandler( object sender, System.EventArgs e); |
可见,EventHandler就是委托。现在就使用EventHandler来执行多个方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class Example { public event EventHandler myEvent; internal void Go() { object sender = 10; EventArgs e = new EventArgs(); //为事件注册多个委托 myEvent += Print; myEvent += Say; myEvent(sender, e); } void Print( object sender, EventArgs e) { Console.WriteLine(sender); } void Say( object sender, EventArgs e) { Console.WriteLine(sender); } } |
总结:
① 委托就是一个类,也可以实例化,
C#中委托和事件的区别实例解析的更多相关文章
- C#中委托和事件的区别
大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法.事件可以被看作一个委托类型的变量,通过事件注册.取消多个委托或方法.本篇分别通过委托和事件执行多个方法,从中体会两者的区别. □ 通过委托 ...
- c# 委托与事件的区别
委托与事件的区别 委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为对委托变量的封装.),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别.事件的内部 ...
- c#之委托和事件的区别
1.什么是委托,这里就不做介绍了,如果想了解可以查看博客:http://www.cnblogs.com/xiaoxiaogogo/p/3571494.html 下面开始对事件进行介绍 1.定义事件以及 ...
- 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别
在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ...
- c#中委托和事件(转)
C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 ...
- c#中委托和事件区别
委托和事件相同的功能 class Dem5 { public Action deHandler; public event Action eveHa; public Dem5() { deHandle ...
- c#中委托和事件(续)(转)
本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器.异常处理.超时处理和异步方法调用等内容. 为什么要使用事件而不是委托变量? 在 C#中的委托和事件 中,我提出了两个为 ...
- C#中委托和事件
目 录 将方法作为方法的参数 将方法绑定到委托 更好的封装性 限制类型能力 范例说明 Observer 设计模式简介 实现范例的Observer 设计模式 .NET 框架中的委托与事件 为什么委托定义 ...
- C#一些知识点:委托和事件的区别
在C#中,委托和事件是比较容易混淆的两个知识点,本篇博客就记录一下委托和事件之间的区别. 定义上的区别 委托:委托实际上是一个类,用来表示一个函数,可以理解为C++中的函数指针. 事件:事件是一个修饰 ...
随机推荐
- 解决VS2012新建MVC4等项目时,收到加载程序集“NuGet.VisualStudio.Interop…”的错误
初装V2012,新建MVC4新项目时出现以下错误: 解决方法为: 通过VS2012的“工具-扩展和更新-联机”安装“NuGet Package Manager”扩展包,可以顺利新建MVC4项目啦!
- 添加zlib压缩步骤 OpenSSL
1.Link Binary With Libraries 中添加 libz.dyllb 2.复制OpenSSL(libssl.a & libcryto.a & NSData+Cocoa ...
- 使用TopShelf轻松开发Window服务
关于TopShelf 描述: Topshelf is a framework for hosting services written using the .NET framework. The cr ...
- 从零开始学android开发-通过WebService进行网络编程,使用工具类轻松实现
相信大家在平常的开发中,对网络的操作用到HTTP协议比较多,通过我们使用Get或者Post的方法调用一个数据接口,然后服务器给我们返回JSON格式的数据,我们解析JSON数据然后展现给用户,相信很多人 ...
- Objective-C Basic
1. Methods and Messages a) class method - call it by sending a message to the class itself b) instan ...
- C++ Button右键弹出式菜单
Button右键弹出式菜单 关键点 用类来实现 的 实现过程 新建1个类 类名CButtonPopMenu 基类CButton 新建1个菜单资源 IDR_MENU1 // ButtonPopMenu ...
- makefile中的patsubst
函数名称:加前缀函数—addprefix. 函数功能:为“NAMES…”中的每个文件名称加入前缀“PREFIX”.參数“NAMES…”是空格切割的文件名称序列,将“SUFFIX”加入到此序列的每个文件 ...
- iOS开发——UI篇&下拉弹出列表选择项效果
下拉弹出列表选择项效果 右边菜单中的按键,点击弹出一个列表可选择,选择其中一个,响应相应的事件并把文字显示在右边的菜单上:弹出下拉效果使用LMDropdownView插件,可以用POD进行加载pod ...
- 免费的天气预报API--谷歌,雅虎,中央气象台
Google Weather API 仅仅支持美国地区使用邮政编码进行查询,比如: http://www.google.com/ig/api?hl=zh-cn&weather=94043 ...
- Ruby on Rails Tutorial 第四章 Rails背后的Ruby 之 类
Ruby和其他面向对象的语言一样,使用类来组织方法,然后实例化类,创建对象.1.构造方法使用双引号是字符串的字面构造方法,也可以使用“具名构造方法”,即在类名上调用new方法 >> s=& ...