垃圾回收

      对于您的用程序建的大多数象,可以依靠 .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();
}

 

posted @ 2010-08-03 13:39  大灰狼的博客  阅读(169)  评论(0)    收藏  举报