delegate委托代理例子,到底有何好处,举个例子说说吧

c#.net中的delegate委托,注意内存泄漏_蓝狐软件工作室
Posted By : 蓝狐
c#.net中的delegate委托是一个非常好的东西,它可以让委托的使用者(客户)自己定义有自己逻辑的函数,c#的事件就是基于委托的,在和也有用委托,但是在使用委托时候有些坑要注意:.net内存对于托管资源是通过垃圾回收器自动根据对象的情况释放的,如果不了解委托的一些关键点,使用不当,内存得不到正确的释放,就会导致内存泄漏了。下面我们通过一个具体的例子说明:
static class A
public static Action X { }
public B()
Console.WriteLine("b created");
Console.WriteLine("b finalized");
private void z()
class Program
static void Main(string[] args)
GC.Collect();
//输出: b created
Console.ReadLine();
GC.Collect();
//输出: b finalized
Console.ReadKey();
当B的对象释放所占用内存时,NET垃圾回收器自动调用类B析构函数~B,通过运行上面的代码可以看出在把A.X设置为null之前,B对象内存是不能释放的,因为A.X委托还有使用B对象的一个z方法,B对象被垃圾.NET垃圾回收器判断为可达对象,所以不回收,当我们调用这句代码:A.X = null的时候,表示A.X为空,就没有使用B对象。最后输出了”b finalized“,释放B内存。
总结:c#.net中的delegate委托类有点像c++中的指针,可以指向一个函数。但是要注意:当一个实例A有一个委托类型的属性引用了另一个类的实例B的方法,如果你想把委托拥有对象A不被回收而被引用的对象B要马上被垃圾回收器回收,那你必须手动得把A对象的委托的引用去掉,设置为null就可以了。不然是B始终在内存中,不会得到释放。
再看一个我们很熟悉的代码:
public delegate int MyDelegate(string message);
public class MyManager MyDelegate
public MyDelegate ManagerD
public class Transaction
public int DoSomething(string message)
//do something
public void init()
var manager = new MyManager();
manager.ManagerDelegate = this.DoSomething("abc");
你知道里面的坑了吗?
本站文章除注明转载外,均为本站原创或翻译,欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,共创和谐网络环境。
转载请注明:文章转载自: >>
本文标题:c#.net中的delegate委托,注意内存泄漏
本文地址:/Article/174.html
本科学历,蓝狐软件工作室创始人。2009年开始从事软件开发行业,从事软件开发互朕网7年以上,3年以上项目管理和架构设计经验,具有丰富的电子商务行业的移动和Web应用的架构设计和开发经验。参与过高并发、高可用、分布式系统设计,熟悉SOA架构设计,有敏捷开发经验。熟悉.NET和Java EE相关技术和框架,熟悉Linux、Windows、Nginx、Mysql等服务器的部署和优化。熟悉主流的开发语言,擅长SQL Server、mysql、Oracle等主流数据库,通过了Oracle OCP 11g认证,有丰富的数据库性能优化和设计经验。独立开发了多个人作品:蓝狐seo管理系统、seo关键词按天计费系统、蓝狐软件工作室门户等。曾在多家移动互联网担当核心技术研发和管理工作,同时承担关键技术难点攻关和设计高性能的技术架构。把握平台的技术发展方向,对技术发展及时提出指导性意见。在提高平台的稳定性、性能、质量等方面做出了重要贡献。目前专职于为企业提供优质的信息化建设服务,其中不限于系统、软件定制开发和高端网站建设。
发表成功!2016年1月 总版技术专家分月排行榜第二2015年11月 总版技术专家分月排行榜第二2015年10月 总版技术专家分月排行榜第二
优秀小版主
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
2017年2月 总版技术专家分月排行榜第三
2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2017年2月 总版技术专家分月排行榜第三
2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2017年2月 总版技术专家分月排行榜第三
2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2017年2月 总版技术专家分月排行榜第三
2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 委托与事件例子 的文章

 

随机推荐