提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2009-04-08 16:06:52.000|阅读 399 次
概述:理解.NET中的委托和事件
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
如果你还为委托和事件犯迷糊,你可以试着回答下面这些问题:让你来设计一个框架(或者程序)实现效果:点击button时实现label1.text=“呵呵,第一次点击!”,你会怎么处理?注意,不要用.net已经实现的框架。
我们会想,在windows系统里应该有一个监听程序,专门处理鼠标点击事件,一旦button被点击,他就会执行一定的程序。大概应该像下面的伪代码一样:
ListenerMethod(){ |
我就可以在{}里写上label1.text=“呵呵,第一次点击”,搞定!如果要实现其他内容,比如再一次点击,就label.text=“没问题,第二次点击”。到此为止,你发现问题么?
如果还没有发现,呵呵,你就有问题了。
我也是在学习了“设计模式”之后才想到的,如果按上面的方法实现,就:
1、你必须把ListenerMethod()方法的具体内容公布出来,不然人家怎么用呢,这些执行的代码写在哪里呢?
2、把方法公开是不好的,为什么?最简单的,怕人家看了干坏事呀,黑客是怎么出来的?呵呵,这其实只是一方面, 更实际的原因甚至是防止自己误操作……不多说了,理解关键字“封装”!接着想,我要不把ListenerMethod()方法暴露出来要怎么办。可不可以 事先写好一个方法,放在{}里,其他人在其他地方写实现的代码,如:
ListenerMethod(){ |
而在另外的地方设好方法名和参数,让其他人填空,如下
TheMethod(){ |
哈哈,有点像了。我们好像也是这样在buttonClick()方法里写实现程序的哟。
这样做,还是有问题,能不能想到?
现在我们是一个button,如果有两个button要实现各自不同的的功能呢,怎么办?我写两个if,哼!三个呢,四个呢……实际上,我做框架的时候还根本不知道会有多少个呢,唉~~再想!
这就要回到最前面猜想的地方了。button和Listener之间是不是要有对应关系?
这种对应关系如何实现?
我们可以想象,计算机系统里面有一个管理鼠标点击button的监听中心,每个button都可以到这个中心“注册登记”他对应的方法,这样,当特定的button被点击时,监听中心可以根据之前的“登记”,执行相应的方法。
看上去上面的方法不错,赞自己一个。那么如何实现上面的构想呢?当然就是用委托和事件了。
可能你还是没怎么搞明白,我也一样,那我们试着动手写程序吧。为了脱离winform之类已有的框架,我们建一个控制台程序。
未使用委托、事件之前的代码。
Code |
可以看出,以上的代码实现一个按钮是可行的,但两个按钮就麻烦了。不到黄河心不甘,我们硬着头皮再写两个按钮的情况吧。
Code
class Program
{
static void Main(string[] args)
{
//实例化一个button类
Button btn = new Button();
btn.Click();//实例化第二个button
Button btn2 = new Button();
btn.Click(); //这样写能行么?
}
}//首先要定义一个Button类,里面应该有一个Click方法
public class Button
{
//Click方法调用固定的方法
public void Click()
{
ForCustome fc = new ForCustome();
fc.Button_Click();//很想在这里面改呀,添一个方法调用
fc.Button2_Click(); //要是再有一段条件判断的逻辑就更好了,是吧?
}
}
//上面这个类是封装了的,用户不可见,或者理解为用户不能更改也可以//下面这个类提供给用户
public class ForCustome
{
public void Button_Click()
{
//用户在这里写具体的方法实现
Console.WriteLine("被点击了!");
}//添一个方法实现是必须的
public void Button2_Click()
{
Console.WriteLine("我是第二个被点击的按钮!");
}
}
如果你是自己在试着写的话,估计你已经崩溃了(反正我是这样),不好办呀。如果看这段代码没有感觉的话,试着写一写。
好了,看看微软是如何解决这个问题的吧。
Code
//先声明一个委托再说,目标是要能调用ForCustome类里的方法,所以注意方法签名
public delegate void myDelegate();
public class Button
{
//声明一个事件,和委托相关联
public event myDelegate ClickIt;
public void Click()
{
//可以想象,这个方法是一个封装了之前我们想要的一大段条件判断语句的“复合体”
ClickIt();
}
}
class Program
{
static void Main(string[] args)
{
ForCustome fc = new ForCustome();//实例化一个button类
Button btn = new Button();
//这里,将按钮的事件和按钮事件对应的(将要触发的)方法相关联,相当于我们之前想象的注册
btn.ClickIt += new myDelegate(fc.Button_Click);
btn.Click();//实例化第二个button
Button btn2 = new Button();
btn2.ClickIt+=new myDelegate(fc.Button2_Click);
btn2.Click(); //这样写能行么?
}
}//这个类提供给用户的,没有变化
public class ForCustome
{
public void Button_Click()
{
//用户在这里写具体的方法实现
Console.WriteLine("被点击了!");
}//添一个方法实现是必须的
public void Button2_Click()
{
Console.WriteLine("我是第二个被点击的按钮!");
}
}
大功告成!欣赏一下吧,相当优雅的一个架构。如果还要再添加一个按钮和对应的事件,你会做了么?
而在Winform和ASP.NET中,给事件对应的方法添加了两个参数并规范了命名,就更完美了。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@capbkgr.cn
文章转载自:自互联网面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@capbkgr.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢