CLR为开发者提供了一个非常让人激动的功能--垃圾回收。但是园子里关于垃圾回收的讨论,大多是讨论垃圾回收的原理,以及Dispose模式。但是垃圾回收在实际使用时,是不是可以达到其设计的目标,在开发过程中有没有需要注意的问题呢?本人也不是非常明确,这篇文章希望能达到抛砖引玉的效果,希望个人牛人能够给本人或同样存在疑惑的人一个清楚明确的答案。
什么是垃圾回收?就是说你在使用CLR的时候(不包含托管资源) ,只需要new一个对象使用。而不需要通过程序代码进行释放对象(以上是本人理解的垃圾回收的意义)。
托管资源 非托管资源
托管资源和非托管资源的区别通常会让开发者弄不清楚,到底什么是托管的,什么不是托管的。这里说一下自己的体会。如果你使用的Class是属于CLR的,不管它实际上使用的什么资源。CLR都会帮你进行垃圾回收。简单的比如一个List对象,你使用完成(变量脱离其作用域)就会被CLR自动回收。那么对于网上常说的数据连接,文件类呢?其实同样会在使用完成后被自动回收,但是因为此类资源很重要,而垃圾回收的时机不确定。所以很多教材上说此类资源需要在使用完成后及时释放(通过程序代码)。这里说明一点就是CLR的Class都会被自动回收,无论它实际控制的是托管资源还是非托管资源。
这里可以做一个简单的测试,一个WinForm项目,两个Button(button1, button2) ,点击事件如下。
private void button1_Click(object sender, EventArgs e)
{