• 利用IDisposable接口构建包含非托管资源对象


    托管资源与非托管资源

    在.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);
    	}
    }
    
  • 相关阅读:
    cxGrid 锁定列
    精选网站
    Delphi XE10 dxLayoutControl 控件应用指南
    合并当前工作簿下的所有工作表
    【集中工作薄】 当前文件夹中所有Excel文件中 多个工作簿的第一个工作表 复制到工作簿中
    CxGrid如何实现导出Excel 功能
    Google Material Design的图标字体使用教程
    Mui沉浸模式以及状态栏颜色改变
    移动端弹性效果
    JS中的“!!”
  • 原文地址:https://www.cnblogs.com/MaFeng0213/p/9948746.html
Copyright © 2020-2023  润新知