.Net Discovery 系列之四--深入理解.Net垃圾收集机制(下)
2009-03-04 09:31
483 查看
上一节给大家介绍了 .Net GC的运行机制,下面来讲下与GC相关的重要方法。
第二节.GC关键方法解析
1.Dispose()方法
Dispose可用于释放所有资源,包括托管的和非托管的,需要自己实现。
大多数的非托管资源都要求手动释放,我们应当为释放非托管资源公开一个方法,实现释放非托管资源的方法有很多种,实现IDispose接口的Dispose方法是最好的,这可以给使用你类库的程序员以明确的说明,让他们知道怎样释放你的资源;而且C#中用到的using语句快,也是在离开语句块时自动调用Dispose方法。
这里需要注意的是,如果基类实现了IDispose接口,那么它的派生类也必须实现自己的IDispose,并在其Dispose方法中调用基类中Dispose方法。只有这样的才能保证当你使用派生类实例后,释放资源时,连同基类中的非托管资源一起释放掉。
插曲:使用using与try+finally的区别
可以说2者没有任何区别,因为using只是编辑器级的优化,它与try+finally有着相同的作用,以下是一段使用using的代码,它在IL阶段也是以try+finally呈现的:
C#:
MSIL:
但是,using的优点是,在代码离开using块时,using会自动调用Idispose接口的Dispose()方法。
public class SomeObject
{
。。。
}
public static void Main()
{
SomeObject so = new SomeObject();
WeakReference WRso = new WeakReference(so);
so = null;
Console.WriteLine(WRso.IsAlive); // True
// 调用GC 手动回收。
GC.Collect();
Console.WriteLine(WRso.IsAlive); // False
}
看到没,在so = null;后,它的弱引用依然是可用的。所以对于大对象的使用,aicken建议使用此种方式。另外,弱引用有长短之分:长弱引用在对象终结后,依然追踪对象;短弱引用则反之,aicken不建议人为干预GC的工作成果,所以推荐使用短弱引用,即上面代码中的方式。
通过以上的讲解,相信大家已经能够很全面的了解.Net GC方面的知识了。
我是李鸣(Aicken) 请您继续关注我的下一篇文章。
第二节.GC关键方法解析
1.Dispose()方法
Dispose可用于释放所有资源,包括托管的和非托管的,需要自己实现。
大多数的非托管资源都要求手动释放,我们应当为释放非托管资源公开一个方法,实现释放非托管资源的方法有很多种,实现IDispose接口的Dispose方法是最好的,这可以给使用你类库的程序员以明确的说明,让他们知道怎样释放你的资源;而且C#中用到的using语句快,也是在离开语句块时自动调用Dispose方法。
这里需要注意的是,如果基类实现了IDispose接口,那么它的派生类也必须实现自己的IDispose,并在其Dispose方法中调用基类中Dispose方法。只有这样的才能保证当你使用派生类实例后,释放资源时,连同基类中的非托管资源一起释放掉。
插曲:使用using与try+finally的区别
可以说2者没有任何区别,因为using只是编辑器级的优化,它与try+finally有着相同的作用,以下是一段使用using的代码,它在IL阶段也是以try+finally呈现的:
C#:
MSIL:
但是,using的优点是,在代码离开using块时,using会自动调用Idispose接口的Dispose()方法。
public class SomeObject
{
。。。
}
public static void Main()
{
SomeObject so = new SomeObject();
WeakReference WRso = new WeakReference(so);
so = null;
Console.WriteLine(WRso.IsAlive); // True
// 调用GC 手动回收。
GC.Collect();
Console.WriteLine(WRso.IsAlive); // False
}
看到没,在so = null;后,它的弱引用依然是可用的。所以对于大对象的使用,aicken建议使用此种方式。另外,弱引用有长短之分:长弱引用在对象终结后,依然追踪对象;短弱引用则反之,aicken不建议人为干预GC的工作成果,所以推荐使用短弱引用,即上面代码中的方式。
通过以上的讲解,相信大家已经能够很全面的了解.Net GC方面的知识了。
我是李鸣(Aicken) 请您继续关注我的下一篇文章。
相关文章推荐
- .Net Discovery 系列之七--深入理解.Net垃圾收集机制(拾贝篇) 发布在新年第一秒
- 艾伟_转载:.NET Discovery 系列之四--深入理解.NET垃圾收集机制(下)
- .Net Discovery系列之三 深入理解.Net垃圾收集机制(上)
- 艾伟_转载:.NET Discovery 系列之七--深入理解.NET垃圾收集机制(拾贝篇)
- .Net Discovery系列之四 深入理解.Net垃圾收集机制(下)
- 艾伟_转载:.NET Discovery 系列之三--深入理解.NET垃圾收集机制(上)
- .Net Discovery 系列之七--深入理解.Net垃圾收集机制(拾贝篇)
- .Net Discovery 系列之三--深入理解.Net垃圾收集机制(上)
- .Net Discovery 系列之七--深入理解.Net垃圾收集机制(拾贝篇)
- .“.NET研究”Net Discovery系列之-深入理解平台机制与性能影响 (中)
- .Net Discovery系列之-深入理解平台机制与性能影“.NET研究”响(下)
- 一起谈.NET技术,.Net Discovery系列-深入理解平台机制与性能影响(上)
- .Net Discovery系列之-深入理解平台机制与性“.NET技术”能影响(下)
- 一起谈.NET技术,.Net Discovery系列之-深入理解平台机制与性能影响 (中)
- 一起谈.NET技术,.Net Discovery系列之-深入理解平台机制与性能影响(下)
- .Net Discovery系列之十-深入理解平台机制与性能影响(上)
- .Net Discovery系列之十二-深入理解平台机制与性能影响(下)
- .Net Discovery系列之十-深入理解平台机制与性能影响(上)
- .Net Discovery系列之十一-深入理解平台机制与性能影响 (中)
- .Net Discovery系列之十二-深入理解平台机制与性能影响(下)