文档介绍:C#内存释放
默认分类2008-03-15 11:26:15 阅读470评论0 字号:大中小 订阅
便于对文章的开展,需要先明确两个概念
,会谈到托管这个概念。 底是什么意思called!" );
}
~DisposeClass()
{
( "Destructor called!" );
}
#region IDisposable Members
public void Dispose()
{
// TODO: Add implementation
( "Dispose called!" );
}
#endregion
}
对于 Close 来说不属于真正意义上的释放,除了注意它需要显示被调用外,我在此对 它不多说了。而对于析构函数而言,不是在对象离开作用域后立刻被执行,只有在关闭进 程或者调用 方法的时候才被调用,参看如下的代码运行结果。
private void Create()
DisposeClass myClass = new DisposeClass();
{
}
private void CallGC()
{
();
}
// Show destructor
Create();
( "After created!" );
CallGC();
运行的结果为:
After created!
Destructor called!
显然在出了 Create 函数外, myClass 对象的析构函数没有被立刻调用,而是等显示调用 才被调用。
对于 Dispose 来说,也需要显示的调用,但是对于继承了 IDisposable 的类型对象可 以使用 using 这个关键字,这样对象的 Dispose 方法在出了 using 范围后会被自动调用。 例如:
using ( DisposeClass myClass = new DisposeClass() )
}
//other operation here
如上运行的结果如下:
Dispose called!
那么对于如上DisposeCiass类型的Dispose实现来说,事实上GC还需要调用对象的析 构函数,按照前面的GC流程来说,GC对于需要调用析构函数的对象来说,至少经过两个 步骤,即首先调用对象的析构函数,其次回收内存。也就是说,按照上面所写的 Dispose 函数,虽说被执行了,但是 GC还是需要执行析构函数,那么一个完整的 Dispose函数,
(this ) 来告诉GC让它不用再调用对象的析构函数 中。 那么改写后的 DisposeCiass 如下:
/// <summary>
/// The class to show three disposal function
/// </summary>
public class DisposeClass:IDisposable
{