没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2009-04-27 09:59:25.000|阅读 296 次
概述:在上篇blog中简单地介绍了委托的基础知识,在这片文章中会介绍下委托跟事件之间的联系。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
在上篇blog中简单地介绍了委托的基础知识,在这片文章中会介绍下委托跟事件之间的联系。
事件的由来
我们可以看到在使用委托进行回调的实现的时候,我们往往需要再定义一个委托对象,以及一个对外公开的辅助方法来添加委托的方法,这样子会使我们感觉比较繁琐。C#提供了event关键字来减轻直接使用委托的负担,编译器会自动提供注册、取消注册的方法和委托必要的成员。首先来看看定义事件的步骤:
1.先定义委托类型;
2.通过event关键字定委托类型的事件。
public delegate int Caculate(int x, int y); public event Caculate OnCaculate;
看看编译器帮我们定义了什么
首先我们可以看到帮我们定义了一个Caculate对象,其次定义了两个方法add_OnCaculate跟remove_OnCaculate。我们可以在看看add_OnCaculate两个方法里面的一些核心的东西。add_OnCaculate:
IL_0008: call class [mscorlib]System.Delegate [mscorlib]System.Delegate::Combine(class [mscorlib]System.Delegate, class [mscorlib]System.Delegate)
很明显地看到add_OnCaculate方法调用的就是委托的Combine方法,从而我们也可以想到remove_OnCaculate方法调用的是Remove方法。从上面我们可以看到其实event关键字只是提供给我们了一种语法上的便利措施。
一个稍微完整的例子
这个例子参考的是《C#与.NET3.0高级程序设计》上面的。使用Car来举例的,当车子加速时到一定限制值时会触发一个预警事件,当超过某一个速度时会触发一个车子爆炸事件。首先看委托跟事件:
public delegate void CarEventHandler(string msg); public event CarEventHandler AbortToBlow; public event CarEventHandler Exploded;
EventCar类中有两个事件一个是AbortToBlow一个是Exploded。下面是Car的几个属性以及字段:
private const int MaxSpeed = 180; public int CurrSpeed { get; private set; } public bool IsDead { get; private set; } public string Name { get; private set; }
其中IsDead是表示车子是否已经报废了。下面是一个加速的方法:
public void Accelerate(int addSpeed) { if (IsDead) { if (this.Exploded!= null) Exploded("The Car Is Dead"); } else { CurrSpeed += addSpeed; if (10 == MaxSpeed - CurrSpeed &&AbortToBlow != null) { AbortToBlow("Careful!Bona blow!"); } if (CurrSpeed >= MaxSpeed) IsDead = true; else Console.WriteLine("CurrentSpeed:{0}", CurrSpeed); } }
完整代码:
public class EventCar { public delegate void CarEventHandler(string msg); public event CarEventHandler AbortToBlow; public event CarEventHandler Exploded; private const int MaxSpeed = 180; public int CurrSpeed { get; private set; } public bool IsDead { get; private set; } public string Name { get; private set; } public EventCar() { } public EventCar(string carName, int currSpeed) { if (currSpeed > MaxSpeed) IsDead = true; else { Name = carName; CurrSpeed = currSpeed; } } public void Accelerate(int addSpeed) { if (IsDead) { if (this.Exploded!= null) Exploded("The Car Is Dead"); } else { CurrSpeed += addSpeed; if (10 == MaxSpeed - CurrSpeed &&AbortToBlow != null) { AbortToBlow("Careful!Bona blow!"); } if (CurrSpeed >= MaxSpeed) IsDead = true; else Console.WriteLine("CurrentSpeed:{0}", CurrSpeed); } } }
客户端调用:
static void Main(string[] args) { EventCar bmw = new EventCar("Henllyee", 110); bmw.AbortToBlow += new EventCar.CarEventHandler(CarAboutToBlow); bmw.Exploded += new EventCar.CarEventHandler(CarExploede); for (var i = 0; i < 10; i++) { bmw.Accelerate(20); Console.ReadLine(); } } public static void CarAboutToBlow(string msg) { Console.WriteLine(msg); } public static void CarExploede(string msg) { Console.WriteLine(msg); }
运行效果:
规范的事件与匿名方法
我们看我们定义的事件似乎跟底层的事件有点不一样,底层的委托的第一个参数一般为System.Object类型的,第二个参数一般为派生自System.EventArgs类型的。第一个参数一般表示发送事件的对象,第二个参数表示与该事件相关的参数。我们可以定义个CarEventArgs:
public class CarEventArgs : EventArgs { public readonly string msg; public CarEventArgs(string Msg) { msg = Msg; } }
委托就可以修改成:
public delegate void CarEventHandler(object send, CarEventArgs e);
使用时:
if (IsDead) { if (this.Exploded!= null) Exploded(this,new CarEventArgs("The Car Is Dead")); }
在上面的时候我们当监听事件的时候都是通过定义一个唯一的与委托签名匹配的方法,在有的时候我们监听的方法也许只需要处理一段简单的逻辑,所以每次都定义个方法毕竟比较麻烦。大都时候我们可以通过匿名方法来监听事件,如:
bmw.AbortToBlow += delegate(object sender, CarEventArgs e) { Console.WriteLine("Message:{0}",e.msg); };
总结
这篇中分析了下事件跟委托的关系,其实事件只是语法定义上的方便,关键还是理解了委托就行。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:博客园面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号