利用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);
}
}
利用IDisposable接口构建包含非托管资源对象的更多相关文章
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
SQL 横转竖 .竖专横 (转载) 普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...
- 5.C#释放非托管资源1
释放非托管资源 在介绍释放非托管资源的时候,我觉得有必要先来认识一下啥叫非托管资源,既然有非托管资源,肯定有托管资源. 托管资源指的是.net可以自棕进行回收的资源,主要是指托管堆上分配的内存资源.托 ...
- C#编程(七十四)----------释放非托管资源
释放非托管资源 在介绍释放非托管资源的时候,我觉得有必要先来认识一下啥叫非托管资源,既然有非托管资源,肯定有托管资源. 托管资源指的是.net可以自棕进行回收的资源,主要是指托管堆上分配的内存资源.托 ...
- IDisposable?释放非托管资源接口
原文:https://www.cnblogs.com/luminji/archive/2011/03/29/1997812.html IDisposable高级篇:https://docs.micro ...
- .NET垃圾回收:非托管资源,IDispose和析构函数的结合
http://blog.jobbole.com/85436/ 原文出处: 田小计划 欢迎分享原创到伯乐头条 前面一篇文章介绍了垃圾回收的基本工作原理,垃圾回收器并不是可以管理内存中的所有资源.对于 ...
- C# 托管资源和非托管资源
托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回 ...
- .NET垃圾回收 – 非托管资源
前面一篇文章介绍了垃圾回收的基本工作原理,垃圾回收器并不是可以管理内存中的所有资源.对于所有的托管资源都将有.NET垃圾回收机制来释放,但是,对于一些非托管资源,我们就需要自己编写代码来清理这类资源了 ...
- 编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源
建议50:在Dispose模式中应区别对待托管资源和非托管资源 真正资源释放代码的那个虚方法是带一个bool参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源. 提供给调用者调用 ...
- [转]在C#中使用托管资源和非托管资源的区别,以及怎样手动释放非托管资源:
托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回 ...
随机推荐
- 什么是TensorFlow?
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面: 从零开始学TensorFlow[01-搭 ...
- 02. Install redis on Linux
安装下载redis,参考官方文档:https://redis.io/download 下载: shell>wget http://download.redis.io/releases/redis ...
- 学习笔记—HTML基础标签
HTML的概念 概念: HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 ( ...
- Android屏幕适配讲解与实战
文章大纲 一.屏幕适配是什么二. 重要概念讲解三.屏幕适配实战四.项目源码下载 一.屏幕适配是什么 Android中屏幕适配就是通过对尺寸单位.图片.文字.布局这四种类型的资源进行合理的设计和 ...
- 配置Asp.Net Web项目NLog配置文件的位置
在使用NLog在asp.net项目中发现,如果想单独配其配置文件的位置时没有像Log4Net的特性配置方案,可以使其提供的 XmlLoggingConfiguration类来初始化: 见:https: ...
- alter session set current_schema=Schema
使用CURRENT_SCHEMA之后,当前会话所参考的默认SCHEMA变为设置的用户,而不再是当前的用户:其实需要稍微理解一下user和schema的区别先:user即oracle中的用户,和所有系统 ...
- Spring boot 配置文件详解 (properties 和yml )
从其他框架来看 我们都有自己的配置文件, hibernate有hbm,mybatis 有properties, 同样, Spring boot 也有全局配置文件. Springboot使用一个全局的配 ...
- Cesium3DTileset示例
3D Tiles是Cesium中很核心的一部分,尤其是用来实现大范围的模型场景数据的加载应用. 三维倾斜模型.人工建模.BIM模型等等,都可以转换成3D Tiles,进而为我们所用. 从Cesium1 ...
- Mysql中concat()、concat_ws()和 group_concat()的用法
一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一个字符串.使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为+----+ ...
- 开源的类似于Apache ab的压力测试命令行工具SuperBenchmarker
SuperBenchmarker 是ㄧ个开源的类似于Apache ab的压力测试命令行工具.可以在 .NET 4.52+ 或者 .NET Core 2.0+ 平台上运行. 可支持Get.Post.Pu ...