VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#教程 >
  • C#教程之C#教程之利用IDisposable接口构建包含非托管资源对

本站最新发布   C#从入门到精通
试听地址  
https://www.xin3721.com/eschool/CSharpxin3721/

托管资源与非托管资源

在.net中,对象使用的资源分为两种:托管资源与非托管资源。托管资源由CLR进行管理,不需要开发人员去人工进行控制,.NET中托管资源主要指“对象在堆中的内存”;非托管资源指对象使用到的一些托管内存之外的内资源(例如操作系统的资源),CLR不会管理这些资源,需要开发人员去控制。.NET对象使用到的非托管资源主要有I/O流、数据库连接、Socket连接、窗口句柄等直接与操作系统操作的相关资源。

管理非托管资源

当一个对象不再使用时,我们应该将它使用的非托管资源释放掉,归还给操作系统,不然等到CLR将它在队中的内存回收之后。这部分内存就会变成不可达状态。只能等到整个应用程序运行结束后才能归还给系统。所以我们应当在该对象实例处于“可达”状态时,既有对象引用指向它时释放非托管资源。

利用IDisposable接口构造含有非托管资源类型的对象

在.net类库中有一个IDisposed的接口。几乎每一个使用非托管资源的类型都应该实现这个接口。那么如果我们看到实现此接口的类型,也应该第一时间想到该类型中包含非托管资源。IDispose接口是管理对象非托管资源的一种原则。代码如下:

interface IDisposable
{
    void Dispose();
}
class ABase:IDisposable
{
    bool _disposed = false;
    public bool Disposed
    {
        get
        {
            return _disposed;
        }
    }
    public ABase(){}

    public void Dispose()
    {
        if(_disposed)
        {
            Dispose(true);
            GC.SuppressFinalize(this);
            _disposed = true;
        }
    }

    protected virtual void Dispose(bool disposing)
    {
        if(disposing)
        {
            //release member's unmanaged resource
        }
        // release ABase's unmanaged resource
    }
    ~ABase
    {
        Dispose(false);
    }
}
class A : ABase
{
    public A()
    {

    }
    protected override void Dispose(bool disposing)
    {
        if(disposing)
        {
            // release member's unmanaged resource
        }
        // release A's unmanaged resource

        // release base class's unmanaged resource
        base.Dispose(disposing);
    }

}
class B:A
{
    public B()
    {

    }


    public void Dosomething()
    {
        if(Disposed)// if released, throw exception
        {
            throw new ObjectDisposedException(...);
        }
        // do something here
    }

    protected override void Dispose(bool disposing)
    {
        if(disposing)
        {
            // release member's unmanaged resource
        }
        // release B's Unmanaged resource
        base.Dispose(disposing);
    }
}
作者:MaFeng 出处:http://www.cnblogs.com/MaFeng0213/ 本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接
相关教程