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


猜你喜欢
- 不适用click而用touch自定义监听:class myOnGestureListener extends GestureDetector
- 本文实例为大家分享了java利用udp实现发送数据的具体代码,供大家参考,具体内容如下1.udp的特点数据以包的形式发送数据udp是面向无连
- 引导要求:线程资源必须通过线程池提供,不允许在应用自行显式创建线程;说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开
- 一. 引入相关jar包首先,我们先在idea里创建出一个Maven项目出来,除了路径要填成自己的希望路径以外,其他都可以一路next和fin
- 一、Hash加密,使用HashAlgorithm哈希算法类的派生类(MD5、SHA1等)特点:只能加密,不可逆。可对目标信息生成一段特定长度
- 本文为大家分享了Android Toast全屏显示的具体代码,供大家参考,具体内容如下废话不说,直接上代码:private void toa
- 本文实例介绍了手机号码归属地接口调用基于C#实现,分享给大家供大家参考,具体内容如下using System;using System.Co
- 本文实例讲述了Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法。分享给大家供大家参考,具体如下
- 大多数开发人员现在还在使用if else的过程结构,曾看过jdon的banq大哥写的一篇文章,利用command,aop模式替代if els
- 在分支较多的时候,switch的效率比if高,在反汇编中我们即可看到效率高的原因一、switch语句1、在正向编码时,switch语句可以看
- 题目给定count=0;让5个线程并发累加到1000;思路创建一个类MyRunnable,实现Runnable(继承Thread类也可)定义
- lambda表达式以及并行流。官方承诺你写出来的代码更运行得更快。流会自动通过Fork/Join池并行地执行。我听过一些关于Java 8的主
- 前置知识在微服务项目中,如果我们想实现服务间调用,一般会选择Feign。之前介绍过一款HTTP客户端工具Retrofit,配合SpringB
- 虽然说模块通信、路由协议在Android已经不新鲜了,但是如果脱离了那些优秀的开源库我们从零开始自己造一个库,有时候重复造轮子会让自己对所谓
- 本文实例为大家分享了Android自定义星星可滑动评分控件的具体方法,供大家参考,具体内容如下此控件通过线性布局结合ImageView来实现
- 项目背景最近在项目上对接前端的的时候遇到了几个问题1.经常要问前端要请求参数2.要根据请求参数写大量if...else,代码散步在 Cont
- 一、RequestMapping注解RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系RequestMappin
- QueryWrapper条件构造之apply、last、select场景: 查询数据库限制条数时mysql上的limit使用 Qu
- 话不多说,请看代码:import java.io.*; import jxl.*; import jxl.write.*; //用java将
- 2018年3月20日,Oracle发布java10。java10为java带来了很多新特性,其中让人眼前一亮的便是var关键字的引入。wha