C#中委托和事件的区别实例解析
本文实例分析了C#中委托和事件的区别,分享给大家供大家参考之用。具体如下:
大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。本篇分别通过委托和事件执行多个方法,从中体会两者的区别。
一、通过委托执行方法
classProgram { staticvoidMain(string[]args) { Exampleexample=newExample(); example.Go(); Console.ReadKey(); } } publicclassExample { publicdelegatevoidDoSth(stringstr); internalvoidGo() { //声明一个委托变量,并把已知方法作为其构造函数的参数 DoSthd=newDoSth(Print); stringstr="Hello,World"; //通过委托的静态方法Invoke触发委托 d.Invoke(str); } voidPrint(stringstr) { Console.WriteLine(str); } }
上述代码实现:
①在CLR运行时,委托DoSth实际上就一个类,该类有一个参数类型为方法的构造函数,并且提供了一个Invoke实例方法,用来触发委托的执行。
②委托DoSth定义了方法的参数和返回类型
③通过委托DoSth的构造函数,可以把符合定义的方法赋值给委托
④调用委托的实例方法Invoke执行了方法
但实际上让委托执行方法还有另外一种方式,那就是:委托变量(参数列表)
publicclassExample { publicdelegatevoidDoSth(objectsender,EventArgse); internalvoidGo() { //声明一个委托变量,并把已知方法作为其构造函数的参数 DoSthd=newDoSth(Print); objectsender=10; EventArgse=newEventArgs(); d(sender,e); } voidPrint(objectsender,EventArgse) { Console.WriteLine(sender); } }
上述代码实现:
①委托DoSth的参数列表和方法Print的参数列表还是保持一致
②委托DoSth中的参数objectsender通常用来表示动作的发起者,EventArgse用来表示动作所带的参数。
而实际上,委托变量(参数列表),事件就是采用这种形式执行方法的。
二、通过事件执行方法
publicclassExample { publicdelegatevoidDoSth(objectsender,EventArgse); publiceventDoSthmyDoSth; internalvoidGo() { //声明一个委托变量,并把已知方法作为其构造函数的参数 DoSthd=newDoSth(Print); objectsender=10; EventArgse=newEventArgs(); myDoSth+=newDoSth(d); myDoSth(sender,e); } voidPrint(objectsender,EventArgse) { Console.WriteLine(sender); } }
上述代码实现:
①声明了事件myDoSth,事件的类型是DoSth这个委托
②通过+=为事件注册委托
③通过DoSth委托的构造函数为事件注册委托实例
④采用委托变量(参数列表)这种形式,让事件执行方法
而且,通过+=还可以为事件注册多个委托。
publicclassExample { publicdelegatevoidDoSth(objectsender,EventArgse); publiceventDoSthmyDoSth; internalvoidGo() { //声明一个委托变量,并把已知方法作为其构造函数的参数 DoSthd=newDoSth(Print); DoSthd1=newDoSth(Say); objectsender=10; EventArgse=newEventArgs(); //为事件注册多个委托 myDoSth+=newDoSth(d); myDoSth+=newDoSth(d1); myDoSth(sender,e); } voidPrint(objectsender,EventArgse) { Console.WriteLine(sender); } voidSay(objectsender,EventArgse) { Console.WriteLine(sender); } }
以上,通过+=为事件注册1个或多个委托实例,实际上,还可以为事件直接注册方法。
publicclassExample { publicdelegatevoidDoSth(objectsender,EventArgse); publiceventDoSthmyDoSth; internalvoidGo() { objectsender=10; EventArgse=newEventArgs(); //为事件注册多个委托 myDoSth+=Print; myDoSth+=Say; myDoSth(sender,e); } voidPrint(objectsender,EventArgse) { Console.WriteLine(sender); } voidSay(objectsender,EventArgse) { Console.WriteLine(sender); } }
三、通过EventHandler执行方法
先来看EventHandler的源代码。
publicdelegatevoidEventHandler(objectsender,System.EventArgse);
可见,EventHandler就是委托。现在就使用EventHandler来执行多个方法。
publicclassExample { publiceventEventHandlermyEvent; internalvoidGo() { objectsender=10; EventArgse=newEventArgs(); //为事件注册多个委托 myEvent+=Print; myEvent+=Say; myEvent(sender,e); } voidPrint(objectsender,EventArgse) { Console.WriteLine(sender); } voidSay(objectsender,EventArgse) { Console.WriteLine(sender); } }
总结:
①委托就是一个类,也可以实例化,通过委托的构造函数来把方法赋值给委托实例
②触发委托有2种方式:委托实例.Invoke(参数列表),委托实例(参数列表)
③事件可以看作是一个委托类型的变量
④通过+=为事件注册多个委托实例或多个方法
⑤通过-=为事件注销多个委托实例或多个方法
⑥EventHandler就是一个委托
相信本文所述对大家C#程序设计的学习有一定的借鉴价值。
相关文章
- C#通过接口获取税控盘基本信息「建议收藏」
- C#正则表达式大全
- c#Parallel.ForEach控制线程数量
- C#开发WebService实例和发布
- C# WPF DataGrid下面 使用CheckBox 选中事件
- C# HttpClient使用和注意事项,.NET Framework连接池并发限制
- C#/.NET/.NET Core Dapper 批量删除、新增、修改说明
- 编写高质量代码改善C#程序——使用泛型集合代替非泛型集合(建议20)
- C#中using的三种用法
- C#简单的加密类实例
- C#索引器简单实例代码
- C#泛型类(函数)的实例化小例子
- C#.NET发送邮件的实例代码
- C#拓展方法的简单实例
- C#对MongoDB进行增删改查的简单操作实例
- C#图片与二进制转换的简单实例
- C#使用MailAddress类发送html格式邮件的实例代码
- c#获取光标在屏幕中位置的简单实例
- c#DateTime常用操作实例(datetime计算时间差)
- jquery+ajax+C#实现无刷新操作数据库数据的简单实例
- c#扫描图片去黑边(扫描仪去黑边)
- C#实现GZip压缩和解压缩入门实例
- C#导入导出EXCEL文件的代码实例
- C#全局热键设置与窗体热键设置实例
- C#的FileSystemWatcher用法实例详解
- C#中实现抽象类里建立静态方法
- C#关于类的只读只写属性实例分析
- C#的File类实现文件操作实例详解
- C#实现闹钟AlarmClock实例代码
- C#中实现可变参数实例
- 使用C#的aforge类库识别验证码实例
- C#启动外部程序的几种常用方法汇总