C#中标准的IDispose模式
C#实现IDispose接口
.net的GC机制有两个问题:首先GC并不能释放所有资源,它更不能释放非托管资源。其次,GC也不是实时的,所有GC存在不确定性。
为了解决这个问题donet提供了析构函数
public class TestClass : System.IDisposable
{
//供程序员显式调用的Dispose方法
public void Dispose()
{
//调用带参数的Dispose方法,释放托管和非托管资源
Dispose(true);
//手动调用了Dispose释放资源,那么析构函数就是不必要的了,这里阻止GC调用析构函数
System.GC.SuppressFinalize(this);
} //protected的Dispose方法,保证不会被外部调用。
//传入bool值disposing以确定是否释放托管资源
protected void Dispose(bool disposing)
{
if (disposing)
{
///TODO:在这里加入清理"托管资源"的代码,应该是xxx.Dispose();
}
///TODO:在这里加入清理"非托管资源"的代码
} //供GC调用的析构函数
~TestClass()
{
Dispose(false);//释放非托管资源
}
}
而即使我们忘记了在合适的时候调用Dispose,GC也会在释放对象的时候帮我们清理非托管资源的。GC所充当的角色只是一种保障手段,它应该充当这种角色,我们不能过分依赖它。实际上,在较大的模块退出时我们还应该及时地手动调用GC.Collect进行垃圾回收。
为什么实现IDisposable接口的类的对象,因为.net CLR是采用GC(垃圾回收器)机制管理内存,不想C++语言那样,能保证对象的析构函数在作用域结束时被总是被自动调用,有时如果程序运行的过程中一直没有满足启动GC的条件,则可能GC一次也没启动。 这样,如果一个类需要占用重要资源,就应该实现IDisposable接口,或者使用另一种简捷的方式:使用Using,如:
Using(MyClass myObj = new MyClass())
{ ... }
对于没有实现IDisposable接口的,也就没什么Dispose方法,但他们的Finalize同样不能保证被调用。
Using(MyClass myObj = new MyClass())
{ ... }
是一种好方法,但是只有MyClass实现了IDisposable接口才能这样写.
IDispose模式在C++中用的很多,用来清理资源,而在C#里,资源分为托管和非托管两种,托管资源是由C#的CLR帮助我们清理的,它是通过调用对象的析构函数完成的对象释放工作,而对于非托管系统来说,则需要我们自己来释放,例如数据库连接对象,这就需要我们手动去调用它的Dispose()方法来实现对象它的释放,事实上,Dispose()内容到底做了什么事,我们并不清楚,当然这就是面向对象,它不希望你关系实现的细节,呵!
对于我们开发人员来说,在了解它怎么用之后,总会对它如何实现的产生兴趣,下面,我将把C#里实现IDispose模式的代码展现出来,大家一起来学习一下,事实上,它的使用场合也很多的,当我们手动对网站,数据库作封装时,都会用的到,下面看一下代码:
/// <summary>
/// 实现IDisposable,对非托管系统进行资源回收
/// </summary>
public class IDisplosePattern : IDisposable
{
public void Dispose()
{
this.Dispose(true);////释放托管资源
GC.SuppressFinalize(this);//请求系统不要调用指定对象的终结器. //该方法在对象头中设置一个位,系统在调用终结器时将检查这个位
} protected virtual void Dispose(bool disposing)
{
if (!_isDisposed)//_isDisposed为false表示没有进行手动dispose
{
if (disposing)
{
//清理托管资源
}
//清理非托管资源
}
_isDisposed = true;
} private bool _isDisposed; ~IDisplosePattern()
{
this.Dispose(false);//释放非托管资源,托管资源由终极器自己完成了
}
}
通过上面的代码,我们知道了,对于托管系统(C#的CLR为我们管理的),直接通过~IDisplosePattern()方法进行释放,而~IDisplosePattern()这个方法何时被调用,我们是不知道的,因为它是由CLR帮助我们调用的,而我们手动进行dispose方法时,它会调用dispose(true)这个重载方法,它会帮助我们清理托管和非托管资源,如图:
aaarticlea/png;base64,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" alt="" />
C#中标准的IDispose模式的更多相关文章
- 基础才是重中之重~C#中标准的IDispose模式
回到目录 IDispose模式在C++中用的很多,用来清理资源,而在C#里,资源分为托管和非托管两种,托管资源是由C#的CLR帮助我们清理的,它是通过调用对象的析构函数完成的对象释放工作,而对于非托管 ...
- 标准IDispose模式浅析
DoNet资源 众所周知,.Net内存管理分托管资源和非托管资源,把内存中的对象按照这两种资源划分,然后由GC负责回收托管资源(Managed Resource),而对于非托管资源来讲,就需要程序员手 ...
- C#中标准Dispose模式的实现
http://www.cnblogs.com/luminji/archive/2011/03/29/1997812.html 需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个 ...
- [No000017B]改善C#程序的建议4:C#中标准Dispose模式的实现
需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:不 ...
- [转]改善C#程序的建议4:C#中标准Dispose模式的实现
需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:不 ...
- 改善C#程序的建议4:C#中标准Dispose模式的实现
http://www.cnblogs.com/luminji/archive/2011/03/29/1997812.html 需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个 ...
- C#中标准Dispose模式的实现(转载)
需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:w ...
- 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- 对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)
一. AES对称加密: AES加密 分组 二. 分组密码的填充 分组密码的填充 e.g.: PKCS#5填充方式 三. 流密码: 四. 分组密码加密中的四种模式: 3.1 ECB模式 优点: 1. ...
随机推荐
- jQuery通用遍历方法each的实现
each介绍 jQuery 的 each 方法,作为一个通用遍历方法,可用于遍历对象和数组. 语法为: jQuery.each(object, [callback]) 回调函数拥有两个参数:第一个为对 ...
- [Dart] Mixin
Docs Mixins are a way of reusing a class’s code in multiple class hierarchies. void main() { Animal ...
- Tips on Probability Theory
1.独立与不相关 随机变量X和Y相互独立,有:E(XY) = E(X)E(Y). 独立一定不相关,不相关不一定独立(高斯过程里二者等价) .对于均值为零的高斯随机变量,“独立”和“不相关”等价的. 独 ...
- MySQL 已有大数据量表进行分区踩坑
一.背景mysql 表中已有 4 亿数据,为提高查询效率,需创建分区,一开始计划是创建 HASH 分区,结果报错:ERROR 1659 (HY000): Field 'partno' is of a ...
- less简介及其编译原理
一.less环境安装 ①首先需要在电脑上安装nodejs,一般会内置npm,利用以下命令可以检测: ②利用npm在线安装less,运行 npm install –g less ③查看是否安装成功,L ...
- mysql 查询账户
查询 mysql 的存在的账户 >select user,host,password from mysql.user; # 可以查询涉及到user. host 链接权限.密码加密文件.
- 【loj2262】【CTSC2017】网络
题目 一颗\(n\)个点的树,求加入一条边点之后两点间最长距离的最小值 : \(n \le 100000\) ; 题解 首先加入边的两个端点一定在直径上面,先\(dfs\)拎出直径来讨论(下标只代表直 ...
- 洛谷P3620 [APIO/CTSC 2007] 数据备份
题目 贪心+堆. 一般贪心题用到堆的时候都会存在一种反悔操作,因此这个题也不例外. 首先电缆一定是连接两个相邻的点的,这很好证明,其次一个点只能被一条电缆连接,所以我们通过选这个电缆,不选相邻电缆和选 ...
- mysql 获取学生个人科目平均分
mysql> select * from test; +----+----------+-------+-----------+ | id | name | score | subject | ...
- MySQL8.0报错Can't connect to MySQL server on 'localhost' (10061)的解决办法
MySQL8.0报错Can't connect to MySQL server on 'localhost' (10061)的解决办法 事情的起因 今天课堂上要展示小组项目,需要用一个软件叫W ...