using强制对象清理资源 【转】
转 http://www.cnblogs.com/Legolas/p/detail-of-using.html
using肯定所有人都用过,最简单的就是使用using引入命名空间,然后就是引入别名,简化输入,本文主要介绍第三种用法,即用using强制对象清理资源。
先看下面这段代码:

try
{
using (SqlConnection con = new SqlConnection(source))
{
//open connection
con.Open();
//do something
con.Close();
}
}
catch (SqlException e)
{
//log the exception
}

代码很简单,就不多说了,这里用using的目的就是为了保证数据库连接这个“稀缺”资源,在使用完毕之后能够立即关闭,即使在using语句块执行时发生异常,在退出时,依然会将该连接关闭。
用法就是这样,很简单,下面说一下这段代码执行的时候CLR为我们做了哪些工作。
IDisposable接口
必须是实现了IDisposable接口的对象才可以使用using来管理。而实现了该接口就意味着需要实现其中的Dispose方法,这个方法就是在using语句块执行结束之后要执行的方法,对于对象资源的处理也在这个方法中进行。下图为上述代码中using语句块对应的IL代码,从图中红色线条圈出的部分可以看出,using语句块最后自动执行了对象的Dispose方法。

如何保证using语句块执行结束之后,Dispose方法一定能执行呢,看一下上图中蓝色线条圈出的两处,大家就会明白,这里CLR也没有多高明的实现,依旧是try...finally语句块来保证的,只是这个try....finally语句块不需要我们添加,CLR会自动为我们处理。
Dispose与终结器(或者叫Finalize方法 or 析构函数)
Dispose方法可以主动调用(如通过using或close方法),从而尽快的释放本地资源,而Finalize则是需要等到GC回收该对象的时候才会被调用,一般Finalize方法用来确保当托管对象的内存被释放时,本地资源不会泄露。
Dispose与close方法
Dispose与close方法的区别:一般情况下如果实现了IDisposable接口,那么建议在实现close方法的时候调用Dispose方法,另外在using语句块结束时CLR会自动调用对象的Dispose方法。它们都是为了清理对象中包装的本地资源,然后等待垃圾回收器自动回收该对象本身占用的内存。
说了半天其实还是一句话:借来的资源,用完了千万赶紧赶紧还回去啊,地主家没有余粮了!
using强制对象清理资源 【转】的更多相关文章
- Effective C++ ----以对象管理资源
以对象管理资源 通过对象的析构函数的自动调用来自动释放资源 第一部分:几种典型的以对象管理资源的例子 1. STL::auto_ptr 获取资源后立刻放入资源管理对象 std::auto_ptr< ...
- [Effective C++ --013]以对象管理资源
这一节基本讲述的是将资源放进管理对象,防止忘记释放资源. 1.一般New和Delete使用场景 void fun() { SimpleClass* pSimpleClass1 = new Simple ...
- 《Effective C++》学习笔记条款13 以对象管理资源
条款 13 :以对象管理资源 例: voidf() { Investment *pInv = createInvestment(); ... ...
- 以对象管理资源——C++智能指针auto_ptr简介
auto_ptr是C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象.auto_ptr对象被初始化为指向由new表达式创建的对象,当auto_ptr对象的生命期结束时, ...
- Effective C++(13) 用对象管理资源
问题聚焦: 从这条准则开始,都是关于资源管理的. 资源,一旦用了它,将来必须还给系统. 本条准则,基于对象的资源管理办法,建立在C++的构造函数,析构函数和拷贝函数(拷贝构造函数和重载赋值操作符)的基 ...
- WPF对象级资源的定义与查找
文章概述: 本演示介绍了怎样定义WPF对象级的资源,并通过XAML代码和C#訪问和使用对象级资源. 相关下载(代码.屏幕录像):http://pan.baidu.com/s/1hqvJNY8 在线播放 ...
- Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为
三.资源管理 资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket ...
- effective C++ 读书笔记 条款14 以对象管理资源
如果我们使用一个投资行为的程序库: #include "stdafx.h" #include <iostream> #include <memory> us ...
- 利用using和try/finally语句来清理资源
使用非托管资源的类型必须实现IDisposable接口的Dispose()方法来精确的释放系统资源..Net环境的这一规则使得释放资源代码的职责 是类型的使用者,而不是类型或系统.因此,任何时候你在使 ...
随机推荐
- [JavaScript] - js
原题 var countSheep = function (num){ //your code here var str = ' sheep...'; var result = ''; for (va ...
- 1月4日笔记 vi编辑器
Penn vi编辑器,全称是visual interface,可以执行输出.删除.查找.替换等众多的文本操作. vi并不是一个排版程序,不可以对字体.格式.段落等其他的属性进行编排. vi是全 ...
- Maven Web项目解决跨域问题
跨域问题目前笔者所用到的方案大致有三种:jsonp,SpringMVC 4以上注解方式和cros三方过滤器. Jsonp JSONP(JSON with Padding)是一个非官方的协议,它允许在服 ...
- 关于set和map迭代器支持的运算
问题: 曾经想遍历一个set遍历.当时是这样写的: set<int>::iterator b = a.begin()+1 后来发现程序报错.究其原因是,set迭代器不支持加减数操作. 查看 ...
- 基于 Python 和 Pandas 的数据分析(4) --- 建立数据集
这一节我想对使用 Python 和 Pandas 的数据分析做一些扩展. 假设我们是亿万富翁, 我们会想要多元化地进行投资, 比如股票, 分红, 金融市场等, 那么现在我们要聚焦房地产市场, 做一些这 ...
- _itemmod_extract_enchant
comment 备注 entry 物品ID CanExtract 1 - 可提取随机FM 0 - 不可提取随机FM,当CanExtract = 1 且有随机FM效果时,随机FM效果会被提取 CanEn ...
- Jtest的简单使用
Jtest主要用于快速测试自己的代码是否正确 条件,导入相应的Jtest包 @Test public void test() { System.out.println(" ...
- 如何对接oracle 建立pdb
Oracle数据库的结构是一个数据库实例下有许多用户,每一个用户有自己的表空间,即每一个用户相当于MySQL中的一个数据库.不久前下了oracle 12c的数据库,安装之后建user时才知道oracl ...
- php CLI SAPI 内置Web Server
PHP 5.4.0起, CLI SAPI 提供了一个内置的Web服务器. 这个内置的Web服务器主要用于本地开发使用,不可用于线上产品环境. URI请求会被发送到PHP所在的的工作目录(Working ...
- [转]jsbsim基础概念
转自: 么的聊链接:https://www.jianshu.com/p/a0b4598f928a 虽然用户不需要掌握太多 JSBSim 飞行模拟器的细节,但是了解 JSBSim 的基本工作流程也会对学 ...