源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C#中的委托、事件学习笔记

  • 时间:2022-11-12 23:53 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C#中的委托、事件学习笔记
[b]1.委托delegate[/b] 委托delegate也是一种类型,在任何可以声明类的地方都可以声明委托,它将方法当做另一个方法的参数进行传递,这样就可以传递不同的方法,完成不同的功能,使程序具有很好的可扩展性。 举例: 假设这里有一台电脑,有人会用它写程序,有人会用它打游戏,有人会用它看电影,有人会用它边听音乐边玩游戏,有人会用它边听音乐边看文档,边上QQ。 这台电脑可以抽象成一个类Computer,里面有个方法DoWork,所有的人都要通过这个方法来做自己的事情。 不用委托的时候我们可以实现一些固定的东西,不够灵活: 例如:
[u]复制代码[/u] 代码如下:
class Program {         static void Main(string[] args) {             Computer computer = new Computer();             computer.DoWork("猪八戒", "在看电影!");             computer.DoWork("沙和尚", "在写程序!");             computer.DoWork("孙悟空", "在玩游戏!");         }     }     public class Computer {         public void DoWork(string name, string work) {             Console.WriteLine("{0}{1}", name, work);         }     }
上面的代码,很死板,调用DoWork的时候只能做一件事情。 所以下面轮到委托登场了。 代码如下:
[u]复制代码[/u] 代码如下:
public delegate void WorkEventHandle(string name);     class Program {         static void Main(string[] args) {             Computer computer1 = new Computer();             WorkEventHandle work = Do1;             computer1.DoWork("孙悟空", work);             Console.WriteLine("");             work = Do2;             computer1.DoWork("八戒", Do2);         }         static void Do1(string name) {             Console.WriteLine("{0}在上QQ!", name);             Console.WriteLine("{0}在听音乐!", name);             Console.WriteLine("{0}在玩游戏!", name);         }         static void Do2(string name) {             Console.WriteLine("{0}在听音乐!", name);             Console.WriteLine("{0}在写代码!", name);         }     }     public class Computer {         public void DoWork(string name, WorkEventHandle Work) {             Work(name);         }     }
委托总结:       优点:委托可以作为方法的一个参数来传递。谁要调用Computer里的DoWork来完成自己的事情,谁就实现委托绑定的方法,这样就可以按照自己的需求传递不同的方法,使程序具有了很好的扩展性。       缺点:我们可以随意的给委托进行赋值,这样就破坏了程序的封装性。 [b]2. 事件[/b] 为了弥补委托的缺陷,所以事件出现了,我们只能对事件进行“+=”和“-=”操作,不可以对事件进行赋值(=)操作。 上面的实例用事件实现如下:
[u]复制代码[/u] 代码如下:
public delegate void WorkEventHandle(string name);     class Program {         static void Main(string[] args) {             Computer computer1 = new Computer();             computer1.Work += new WorkEventHandle(Do1);             computer1.DoWork("孙悟空");             Console.WriteLine("");             computer1.Work += new WorkEventHandle(Do2);             computer1.DoWork("八戒");         }         static void Do1(string name) {             Console.WriteLine("{0}在上QQ!", name);             Console.WriteLine("{0}在听音乐!", name);             Console.WriteLine("{0}在玩游戏!", name);         }         static void Do2(string name) {             Console.WriteLine("{0}在听音乐!", name);             Console.WriteLine("{0}在写代码!", name);         }     }     public class Computer {         public event WorkEventHandle Work;         public void DoWork(string name) {             if (Work != null) {                 Work(name);             }         }     }
[b]总结:[/b] 委托既可以进行“+=”和“-=”操作,也可以进行赋值(=)操作,委托不具有封装性 事件只可以进行“+=”和“-=”操作,事件具有封装性。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部