垃圾回收
对于您的应用程序创建的大多数对象,可以依靠 .NET Framework 的垃圾回收器隐式地执行所有必要的内存管理任务。但是,在您创建封装非托管资源的对象时,当您在应用程序中使用完这些非托管资源之后,您必须显式地释放它们。最常见的一类非托管资源就是包装操作系统资源的对象,例如文件、窗口或网络连接(也包括数据库连接)。虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。对于这些类型的对象,.NET Framework 提供 Object.Finalize 方法,它允许对象在垃圾回收器回收该对象使用的内存时适当清理其非托管资源。默认情况下,Finalize 方法不执行任何操作。如果您要让垃圾回收器在回收对象的内存之前对对象执行清理操作,您必须在类中重写 Finalize 方法。
注意点:
C#中不能调用或重写Finalize方法。
C#中同样不能重写或调用析构函数,析构函数会被自动调用。
C#中可以同过析构函数实现Finalize方法。
如下的析构函数和Finalize方法等同。
Class Car
{
~Car()
{
}
}
等同于如下的Finalize
Protected override void Finalize()
{
Try
{
// Cleanup statements
}
Finally
{
Base.Finalize();
}
}
一般的c#可以通过实现IDispose接口来进行垃圾回收,基本的实现方法,如下代码:
定义如下的DisposableResource类:
public class DisposableResource:IDisposable
{
private Stream _resource;
private bool _disposed;
public DisposableResource(Stream stream)
{
if (stream == null)
{
throw new ArgumentNullException("Stream is null.");
}
if (!stream.CanRead)
{
throw new ArgumentException("Stream must be readable.");
}
_resource = stream;
_disposed = false;
}
public void DoSomethingWithResource()
{
// 一些实际的操作
if (_disposed)
{
throw new ObjectDisposedException("Resource is disabled.");
}
int numBytes = (int)_resource.Length;
}
// 在此类中析构函数可以不写,因为已经定义了Dispose,一般定义析构函数为了防止没有Dispose的时候清理垃圾
// 并且析构函数在debug的时候不会进来,而是由系统自动调用。
~DisposableResource()
{
this.Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
if (_resource != null)
{
_resource.Dispose();
}
}
_resource = null;
_disposed = true;
}
}
}
调用上面的类:
FileStream fs = File.OpenRead(@"H:\Solutions2\FinalizeStudy\aa.txt");
using (DisposableResource test = new DisposableResource(fs))
{
test.DoSomethingWithResource();
}

浙公网安备 33010602011771号