c# in deep 之委托
通俗来讲,委托就是吩咐别人去做某件事,但不知道他具体会怎么做。使用委托必须注意的一个问题是内存泄露问题:假如委托实例本身不能被回收,委托实例会阻止他的目标被作为垃圾回收。尤其是假如某“短命”的对象调用了一个“长命”的对象中的事件,并用其自身作为目标。“长命”对象间接容纳了对“短命”对象的引用,延长了“短命”对象的寿命。下面是一个只为委托而委托的例子:
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的返回值是最后一个操作返回值,假如有一个操作抛出异常,则后面的操作都会被停止。
最新文章
- Highcharts指南
- SQL2008";阻止保存要求重新创建表的更改";问题的解决
- Saiku如何固定查询结果table的表头和首列
- freemarker配置,使用
- JS学习笔记Day26
- Docker Data Center系列(一)- 快速搭建云原生架构的实践环境
- Python自动发送邮件提示:smtplib.SMTPServerDisconnected: please run connect() first
- 动手动脑——JAVA语法基础
- ES6 promise学习笔记 -- 基本用法
- Spark实践 -- 夜出顾客服务分析
- java - 百钱百鸡小算法
- SQL Serever学习11——数据库的安全管理
- Linux下多个.c文件的编译和Makefile文件
- 洛谷——P3905 道路重建
- WebFlux03 SpringBoot WebFlux实现CRUD
- vue 父组件如何调用子组件的函数Methods
- java调用7zip解压压缩包
- winform-实现类似QQ停靠桌面上边缘隐藏的效果
- chrome性能指标(TTFB,TTSR,TTDC,TTFL)
- python面试题解析(网络编程与并发)