很多朋友在学习C#的过程中感到比较头疼的一个难题就是事件和委托,灵活应用事件和委托是提升.net水平的一个关键,
而如何正确理解事件和委托是根本所在。本文试着用一种诙谐通俗的说法给你讲解事件和委托,在笑笑之余,深刻理解和记忆
什么是事件和委托。
故事一:现代社会生活节奏太快,很多人忙于工作而无暇顾及感情问题,因此特别是我们IT界出现很多钻石王老五。呵呵,
因此现在出现了如何和陌生美女搭讪的培训班。现在模拟下整个培训过程[本故事构思来源于sohu的一篇文章]。
阶段一:什么都要老师教。
学生甲:遇到活泼类型美女怎么搭讪?老师:搭讪方法(美女类型 活泼类型)
学生已:遇到文静类型美女怎么搭讪?老师:搭讪方法(美女类型 文静类型)
学生丙:遇到职业白领类型美女怎么搭讪?老师:搭讪方法(美女类型 职业白领类型)
........................
如此下去,各学生开始去实验了
public void 实验(美女a)
{
if(美女a.类型==活泼类型)
{
搭讪方法(美女类型 活泼类型);
}
else if(美女a.类型==文静类型)
{
搭讪方法(美女类型 文静类型);
}
else if(美女a.类型==职业白领类型)
{
搭讪方法(美女类型 职业白领类型);
}
.....................
}
阶段二:学会综合应用了,会同时用老师教的几种方法了。因为人的性格是多样的,因此对同一美女只有一种方法还不行,所以有的人学会了对一个人用多种方法。
如果按照阶段一的水平,老师又得提供了以下几个方法。
public void 搭讪方法1(文静和职业白领综合类型 某类型美女)
{
搭讪方法(美女类型 文静类型);
搭讪方法(美女类型 职业白领类型);
}
public void 搭讪方法2(活泼和职业白领类型 某类型美女)
{
搭讪方法(美女类型 活泼类型);
搭讪方法(美女类型 职业白领类型);
}
学生又开始试验了//这次我们遇到美女b,是文静和职业白领综合类型。
搭讪方法1(美女b);//美女c,是活泼和职业白领类型,那得又写个方法了
搭讪方法2(美女c)//碰到美女d,是.....类型,那又得写个搭讪方法3了。
搭讪方法3(美女d)长此以往写的累啊,我们能不能写个类之类的东西(委托就是一种特殊的类,最后给大家总结)来代表所有的方法(注意这个类是用来代表方法的,专业一 点是方法的引用,或指向方法的指针)。当然可以了,程序员的最高使命就是实现,没什么不可能的。于是我们定义个委托(特别的类)来代表方法。
public delegate void 搭讪方法的委托(美女类型 某种类型);[注:为什么写搭讪方法的委托,大家要从字面上理解,这个东西就是来委托真的要执行的那个方法去执行的。]
这样在泡MM的时候,老师只告诉他下面一个方法就好了
public void 老师提供的搭讪方法(美女类型 某类型,搭讪方法 某方法)
{
}那么学生如何去具体做呢?
public void 实验(美女类型 b类型美女)
{
//首先是文静类型的
搭讪方法的委托 b类型美女搭讪要委托执行的方法= 搭讪方法(美女类型 文静类型);
//其次是职业白领类型的
b类型美女搭讪要委托执行的方法 += 搭讪方法(美女类型 职业白领类型);//添加完你要委托的方法,开始具体泡MM了
老师提供的搭讪方法(b类型美女,b类型美女搭讪要委托执行的方法);
}看到了么,碰到了美女,你想用哪种方法就加哪种方法,不用if-else来判断了,不错吧。
阶段三:青出于蓝而胜于蓝的阶段,还会自己创造老师没有的方法来泡MM。这次我们对刚提到的委托固定一个引用,(前面是每个MM我们要声明一个委托,然后在这个委托的基础上加搭讪的方法)以后甭管咋样,我都用这个固定的委托来添加方法。public event 搭讪方法的委托 搭讪事件[注:其实就是固定一个委托的引用,以后都用这个了,不许自己定义];
这时用不着老师,自己会创造了,出山了。
public void 实验(美女类型 超级美女M)
{
搭讪事件+=new 搭讪方法的委托(自己创造的搭讪方法一(超级美女M));
搭讪事件+=new 搭讪方法的委托(自己创造的搭讪方法二(超级美女M));
搭讪事件+=new 搭讪方法的委托(自己创造的搭讪方法三(超级美女M));
//想用多少种方法,自己自由发挥啊
.............................
}private void 自己创造的搭讪方法一(美女类型 m)
{
//自己自由发挥
}private void 自己创造的搭讪方法二(美女类型 m)
{
//自己自由发挥
}private void 自己创造的搭讪方法三(美女类型 m)
{
//自己自由发挥
}总结一下:委托就是对方法的抽象,事件就是对委托的固定引用,对这个委托常例化。就 像我们的按钮事件,a按钮点击调用一个方法,b按钮点击调用一个方法,后来我们对按钮的点击都抽象成固定成Click事件,然后你想添加什么方法就添加什 么方法。这篇文章所写的方法,具体是客户端(调用端)的还是服务端的可能大家有些混淆,搭讪方法都是老师教的(老师类,服务端),除了后来自己创造的。实 验方法都是客户端(调用端)。
补充:本来还准备给大家准备个故事的,还给大家结合设计模式谈谈委托和事件的,没想到写第一故事就这么占版面,就算了。我想大家好好理解这个就差不多了,然后看看其他blog里关于委托和事件的文章,我相信你一定能突破这个难点的。祝你成功!欢迎大家拍砖批评和指正,不胜感激!
出处:http://jackhuclan.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述