通俗来讲,委托就是吩咐别人去做某件事,但不知道他具体会怎么做。使用委托必须注意的一个问题是内存泄露问题:假如委托实例本身不能被回收,委托实例会阻止他的目标被作为垃圾回收。尤其是假如某“短命”的对象调用了一个“长命”的对象中的事件,并用其自身作为目标。“长命”对象间接容纳了对“短命”对象的引用,延长了“短命”对象的寿命。下面是一个只为委托而委托的例子:

delegate void StringProgressor(string input);          //声明委托类型
    class Person
    {
        string name;
        public Person(string name) { this.name = name; }
        public void Say(string message)              //声明兼容的实例方法
        {
            Console.WriteLine("{0} says {1}",name,message);
        }
    }
    class Background
    {
        public static void Note(string note)            //声明兼容的静态方法
        {
            Console.WriteLine("({0})",note);
        }
    }
    class Program
    {
        static void Main()
        {
            Person jon = new Person("Jon");
            Person tom = new Person("Tom");
            StringProgressor jonsVoice, tomsVoice, background;//创建三个委托实例
            jonsVoice = new StringProgressor(jon.Say);
            tomsVoice = new StringProgressor(tom.Say);
            background = new StringProgressor(Background.Note);

jonsVoice("Hello son.");               //隐式调用委托实例
            tomsVoice.Invoke("Hello Daddy");          //显式调用委托实例
            background("An airplane flies past");
            Console.ReadKey();
        }
    }

  委托的实质是间接完成某种操作,这样做增大了代码的复杂性,但提高了代码的灵活性。在真正使用时,委托实例实际上有一个操作列表与之关联,称为委托实例的调用列表。其中Combine(+=)和Remove(-=)负责添加和删除。在委托实例被调用时,所有操作都按顺序执行,如果其有一个非void的返回值,则Invoke的返回值是最后一个操作返回值,假如有一个操作抛出异常,则后面的操作都会被停止。

最新文章

  1. Highcharts指南
  2. SQL2008"阻止保存要求重新创建表的更改"问题的解决
  3. Saiku如何固定查询结果table的表头和首列
  4. freemarker配置,使用
  5. JS学习笔记Day26
  6. Docker Data Center系列(一)- 快速搭建云原生架构的实践环境
  7. Python自动发送邮件提示:smtplib.SMTPServerDisconnected: please run connect() first
  8. 动手动脑——JAVA语法基础
  9. ES6 promise学习笔记 -- 基本用法
  10. Spark实践 -- 夜出顾客服务分析
  11. java - 百钱百鸡小算法
  12. SQL Serever学习11——数据库的安全管理
  13. Linux下多个.c文件的编译和Makefile文件
  14. 洛谷——P3905 道路重建
  15. WebFlux03 SpringBoot WebFlux实现CRUD
  16. vue 父组件如何调用子组件的函数Methods
  17. java调用7zip解压压缩包
  18. winform-实现类似QQ停靠桌面上边缘隐藏的效果
  19. chrome性能指标(TTFB,TTSR,TTDC,TTFL)
  20. python面试题解析(网络编程与并发)

热门文章

  1. 十天学Linux内核之第三天---内存管理方式
  2. Android第一次打开应用程序,实现向导界面
  3. java_OutOfMorryError 内存溢出(replaceAll)
  4. 【转】UiAutomator简要介绍
  5. POJ3342——Party at Hali-Bula
  6. NET 2015
  7. Android基础之——startActivityForResult启动界面并返回数据,上传头像
  8. Windows服务之启动、停止、暂停、继续
  9. 2014阿里实习生面试题——mysql如何实现的索引
  10. C语言库函数大全及应用实例二