您的位置:首页 > 其它

.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) 请您继续关注我的下一篇文章。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐