软件编程
位置:首页>> 软件编程>> C#编程>> C#回收机制之资源回收托管

C#回收机制之资源回收托管

作者:農碼一生  发布时间:2022-03-04 13:18:20 

标签:C#,回收,机制,资源,托管

一、常见非托管资源

  • Windows窗口句柄、数据库链接、GDI对象、独占文件锁等等对象

  • ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor

  • FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen

  • Regex,Socket,StreamWriter,Timer,Tooltip

二、实现原理

定义类继承IDisposable接口

public class DisposeTest : IDisposable
{
   //实现IDisposable接口方法
   public void Dispose()
   {

}
}

在类中定义资源和方法

public class DisposeTest : IDisposable
   {

#region Dispose经典实现方式

//实现IDisposable接口方法
       public void Dispose()
       {
           Dispose(true);//调用处理方法
           GC.SuppressFinalize(this);//让GC忽略
       }

//资源
       private readonly IntPtr unmanagedResource;//非托管内存
       private readonly SafeHandle managedResource;//托管资源

//构造方法初始化资源
       public DisposeTest()
       {
           unmanagedResource = Marshal.AllocHGlobal(sizeof(int));//分配非托管内存
           managedResource = new SafeFileHandle(new IntPtr(), true);//创建托管资源
       }
//根据不同资源进行处理
       protected virtual void Dispose(bool isManualDisposing)
       {
           ReleaseUnmanagedResourse(unmanagedResource);//处理非托管资源
           if (isManualDisposing)
           {
               ReleaseManagedResources(managedResource);//处理托管资源
           }
       }

private void ReleaseUnmanagedResourse(IntPtr intPtr)
       {
           Marshal.FreeHGlobal(intPtr); //释放非托管内存
       }

private void ReleaseManagedResources(SafeHandle safeHandle)
       {
           if (safeHandle != null)
           {
               safeHandle.Dispose(); //释放托管资源
           }
       }

//析构函数处理托管资源
       ~DisposeTest()
       {
           Dispose(false);
       }
       #endregion
   }

三、Close()和Dispose()区别

  • lose()方法关闭对象,没有完全释放。Dispose()方法完全释放了

  • 一般情况,Close() 实现了接口对Dispose()的封装,调用时不需要直接调用Dispose()

四、常见封装的语法写法

Close()方法

SqlConnection conn3 = new SqlConnection();
try
{
   conn3.Open();
}
catch (Exception)
{
   throw;
}
finally
{
   conn3.Close();//关闭对象
}

using()

using (SqlConnection cnn = new SqlConnection())
{
   //此处使用,使用完后系统会自动释放
}

Dispose()

SqlConnection cnn2 = new SqlConnection();
try
{            
   //这里写要执行的代码
}
finally
{
   cnn2.Dispose();
}

来源:https://www.cnblogs.com/wml-it/p/16081656.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com