Chinaunix首页 | 论坛 | 博客
  • 博客访问: 369885
  • 博文数量: 71
  • 博客积分: 4691
  • 博客等级: 上校
  • 技术积分: 935
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-14 15:14
个人简介

who am i ... i'm back.

文章分类

全部博文(71)

文章存档

2014年(4)

2011年(1)

2010年(22)

2009年(17)

2008年(27)

我的朋友

分类: C/C++

2010-12-18 17:33:59

c# finalize 就是析构函数,即destructor;
    dispose 是设计为了主动释放非托管资源(同时也可以释放包含的托管资源使用的非托管资源)。

dispose是主动释放,一般用using语法可以代为实现
finalize是GC 来调用,时间和顺序不可预知。


为了及时释放非托管资源,我们利用dispose。

在finalize中我们需要注意,不要调用释放相关托管资源的dispose,因为这个时候相关托管资源的状态不可预知。

托管资源的释放有2个阶段; 第一个阶段调用finalize,进行主动清理, 第二个阶段真正释放占用内存。
如果我们不需要主动释放或清理动作,我们可以使用GC.SuppressFinalize(this) 来忽略此过程,节省。


using System;
public class ResourceHolder : IDisposable
{
    private bool isDisposed = false;

    //主动调用释放资源的dispose(using)
    public void Dispose()
    {
    Dispose(true);  //true参数表明可以把包含的托管资源的dispose进行调用
    GC.SuppressFinalize(this);  //dipose后告诉GC不需要再调用finalize了
    }
protected virtual void Dispose(bool disposing)
{
    if (!isDisposed)  //如果没有dispose过
    {
        if (disposing)  //如果真表明需要主动释放相关非托管资源
        {
            // Cleanup managed objects by calling their  Dispose() methods.
        }

        //释放非托管资源
        // Cleanup unmanaged objects
    }

    isDisposed = true;  //指示已经dipose过了
}

//被GC调用了的析构函数
~ResourceHolder()
{
    Dispose (false);
}

public void SomeMethod()
{
// Ensure object not already disposed before execution of any method
if(isDisposed)
{
throw new ObjectDisposedException(“ResourceHolder”);
}
// method implementation …
}
}
阅读(707) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-12-20 16:45:22

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com