C#基础知识回顾:1.由WeakReference想到对象的创…
2018-06-18 00:14:41来源:未知 阅读 ()
.Net Framework中,把资源分为托管资源和非托管资源两大类,
托管资源指可以通过.Net Frame垃圾回收器进行回收的资源,主要是指分配在托管堆上你的内存资源,这类资源的回收是不需要人工干预,.Net Framework的垃圾回收器会在合适的时刻进行回收,程序也可以主动调用GC.Collect()强制执行垃圾回收(但是不建议)。
非托管资源则是指不能被.Net Framework垃圾回收器回收的资源,主要包括以下几类:文件读写、窗口操作、网络连接、数据库连接、GDI画刷、图标等。针对这类资源,垃圾回收器能够跟踪其生存期,但不了解具体如何清理这些资源。针对这类资源,垃圾回收器在清理的时候回调用Object.Finalize()方法,该方法是虚方法,非托管对象需要重写方法来实现资源回收。
托管对象是不能重载Object.Finalize()方法,编译器会自动根据析构函数生成对应的Object.Finalize()方法,因此,当托管对象中使用到非托管资源时,需要在析构函数中释放该资料。
析构函数的定义如下(在方法名称为类名称前加了一个“~”):
public class TestA { public string Name = "TestA"; ~TestA() { Console.WriteLine("Dispose TestA"); } }
由于析构函数是有垃圾回收器主动调用的,因此,调用该方法前,类包含的托管对象可能已经被主动回收了,此时再进行释放操作,可能会造成异常,因此,不建议在析构函数中释放托管资源。
垃圾回收器的操作时机是.NetFramework自己所决定的,它会在系统内存的占用和系统系统之间作一个平衡来决定何时出发,因此,对于非托管资源,这类资源属于宝贵资源,必须及时地释放掉,不能有垃圾回收器来决定何时释放。
.Net Framework中为回收资源,而定义了一个接口,IDisposable定义为:
1 // 2 // 摘要: 3 // Defines a method to release allocated resources. 4 [ComVisible(true)] 5 public interface IDisposable 6 { 7 // 8 // 摘要: 9 // Performs application-defined tasks associated with freeing, releasing, or resetting 10 // unmanaged resources. 11 void Dispose(); 12 }
任何包括非托管资源的类都需要继承此接口,并在接口方法中实现对托管资源和非托管资源的释放操作,同时在析构函数中实现对非托管资源的释放。
这么实现的好处就是:代码中显示调用Dispose()时,能够主动地释放资源(托管和非托管),垃圾回收器就会移除该对象不会执行回收操作(即不再执行Finalize()方法),从而提高了性能。而如果没有显示调用Dispose(),垃圾回收器也会在适当的时机调用Finalize()方法来释放非托管资源。
C#语言中using关键字作为语法糖出现,将非托管资源的使用包含在using()中使用,执行完成后会主动调用Dispose方法来释放资源。
基于性能考虑,应该降低使用析构函数来释放资源的使用频率,因此,没有析构函数的对象在垃圾处理器中直接删除,而包括析构函数的对象,则需要先执行析构函数,然后删除对象,增加了一次操作,会降低垃圾回收器的工作效率,从而影响性能。因此,对于非托管对象的释放,应该实现IDispose接口来回收资源,而不依赖垃圾回收器。
当前类使用new关键字创建了另一个类的实例时,当前类对新建的类实例的引用称为强引用,当新建类实例没有释放时,垃圾回收器则无法回收这个对象。只有将该引用释放的时候,垃圾回收器才会回收该对象。
1 TestA a = new TestA(); 2 a = null; 3 GC.Collect(); 4 //当把变量a置为null,主动执行垃圾回收后就会回收该对象。
编程过程,我们会遇到这样的场景,持有一个对象实例的引用,这个实例比较庞大且创建成本不是太高,但是使用频率比较低。该情况下,可以使用WeakReference对这个实例进行包装,当需要使用当对象时,先调用WeakReference.IsAlive是否等于true或者Target不等于null,判断该对象实例是否存在,若存在则调用其Target并强制转换后使用,若不存在,则需要重新创建一个新的实例来使用。使用WeakReference包括的对象实例,垃圾回收器会释放该实例,回收其内存空间。所用,使用前必须判断其是否仍然存在。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:DevExpress安装说明
- c++-const 2019-12-20
- C++ 01 基础知识点 2019-10-30
- 类中的函数重载 2019-09-23
- C++临时变量的回顾思考以及librdkafka设置回调函数注意点 2019-09-17
- 对C++中结构体的回顾 2019-06-14
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash