IDisposeable,Close
一.资源分类
资源分为托管资源和非托管资源。
非托管资源:所有的windows内核对象(句柄)都是非托管资源,如stream,数据库连接,GDI+和COM对象等,这些资源不受CLR管理。
托管资源:由CLR管理的资源。
释放
非托管资源:需要显式释放。
托管资源:系统释放。
二.释放方式
1.实现IDisposeable接口的Dispose()方法
2.采用析构函数
3.Close(),其实跟第一种一样
三.Dispose(),Close()区别
资源释放的一个正确的措施是实现IDisposeable接口Dispose()方法。需要释放资源时,显式调用Dispose()方法即可。
C#还有一个语法糖,使用Using块,在离开using块的时候,CLR会自动调用所创建对象的Dispose()方法。
Close():
public void Cloase()
{
//.....
((IDisposeable)this).Dispose(); }
Dispose():
void IDisposeable.Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
从上面代码来看,Close()方法最终还是使用的Dispose()方法,
之所以这么做,是因为这些类型出于显式实现IDisposable的因素,在调用这些Dispose方法的时候,必须完成一次转型,如:
((IDisposable)new A()).Dispose();
为了避免转型,同时也为了避免不熟悉C#语法的开发人员更直观的释放资源,提供了Close方法。
GC.SuppressFinalize(this);
这是告诉CLR,在进行垃圾回收的时候,不用再继续调用析构函数了。也验证了析构函数只是作为资源释放的一种补救措施,真正有效的还是Dispose()。
下面是合理的释放模式函数:
class ShouldDispose:IDisposeable
{
public void Dispose()
{
this.Dispose(true);
DC.SuppressFinalize(this);
} protected virtual void Dispose(bool disposing)
{
if(disposing)
{...} } ~ShouldDispose(){...} //没有返回类型,没有参数,没有修饰符 } class test:ShouldDispose
{
protected virtual void Dispose(bool disposing)
{
if(disposing)
{
//执行子类清理代码
}
else
{
//如果有必要,执行base.Dispose(disposing)
}
} public void Close()
{
//调用本类或基类的Dispose方法
}
}
本文章内容来自CSDN:http://blog.csdn.net/luminji/article/details/16984497
IDisposeable,Close的更多相关文章
- IDisposeable 最佳实现
public class MyClass : IDisposable { #region 变量声明 // 指向外部非托管资源 private IntPtr handle; // 此类使用的其它托管资源 ...
- Entity FrameWork 365日系列文章源码研究 (1)
By KMSFan -- 此系列的文章只作为自己的读书笔记,不纳入博客园首页. 总结的知识点: 1.DBContext 类 2.Attribute里的属性(NotNull) 3.DbContext实 ...
- 表单和 HTML 辅助方法– ASP.NET MVC 4 系列
这里有一个疑问,诸如在文本编辑器中输入 HTML 元素如此简单的任务,也需要任何帮助吗?的确,输入标签名称是很容易的事,但是确保 HTML 页面链接中的 URL 指向正确的位置.表单元素 ...
- C# 托管和非托管混合编程
在非托管模块中实现你比较重要的算法,然后通过 CLR 的平台互操作,来使托管代码调用它,这样程序仍然能够正常工作,但对非托管的本地代码进行反编译,就很困难. 最直接的实现托管与非托管编程的方法就是 ...
- 【原创】.NET之我见
最近在准备面试,自己也顺带巩固了下基础,加上自己对码农的一些理解都写在这里了,水平不行,欢迎吐槽 //.NET基础 1.Class 和struct 区别 类是一种“引用类型”.创建类的对象时,对象赋值 ...
- 译文---C#堆VS栈(Part Four)
前言 在本系列的第一篇文章<C#堆栈对比(Part Three)>中,介绍了值类型和引用类型在Copy上的区别以及如何实现引用类型的克隆以及使用ICloneable接口等内容. 本文为文章 ...
- using关键字的用法
1.using 关键字可以用来导命名空间,与java中的import类似. 2.using关键字可以用来释放资源,并且被释放的资源代码是非托管代码. 既然可以释放非托管代码,那么什么是非托管代码? 我 ...
- Clr Via C#读书笔记---计算限制的异步操作
线程池基础 1,线程的创建和销毁是一个昂贵的操作,线程调度以及上下文切换耗费时间和内存资源. 2,线程池是一个线程集合,供应你的用程序使用. 3,每个CLR有一个自己的线程池,线程池由CLR控制的所有 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:实现基本的CRUD功能
英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC 5 系列 ...
随机推荐
- linux 下查找图片文件方法
通常是通过文件后缀名查找图片文件,如果没有文件后缀的图片或者伪造的图片文件,则这种判定方法将达不到要求.我们可以根据读取文件头进行图片文件类型的判定. 比较流行的图片文件类型有:jpg png bmp ...
- Javascript常见浏览器兼容问题
常见浏览器原生javascript兼容性问题主要分为以下几类: 一.Dom 1.获取HTML元素,兼容所有浏览器方法:document.getElementById("id")以I ...
- 将摄像头的读入的人像放入背景视频中_with_OpenCV_in_Python
import cv2 import numpy as np import time cap = cv2.VideoCapture(0) background_capture = cv2.VideoCa ...
- 【SQL注入】mysql中information_schema详解
在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库.其中保存着关于MySQL服务器所维护的所有其他数据库的信息.如数据库名,数据库的表,表栏的数据类型与访问 ...
- Hibernate映射类型
- ios 中的 GCD
摘自:http://www.cocoachina.com/swift/20150129/11057.html libdispatch是Apple所提供的在IOS和OS X上进行并发编程的库,而GCD正 ...
- 剖析Linux系统调用的执行路径
在什么是操作系统这篇文章中,介绍过操作系统像是一个代理一样,为我们去管理计算机的众多硬件,我们需要计算机的一些计算服务.数据管理的服务,都由操作系统提供接口来完成.这样做的好处是让一般的计算机使用者不 ...
- 记录下 Markdown 语法
github上常用markdown语法:Mastering Markdown 目录 0. 目录 1. 锚点 2.标题 3.超链接 3.1.行内式 3.2.自动链接 4.列表 4.1.有序列表 4.2. ...
- touch pointer
在早期的浏览器,输入的事件其实相对单纯,只有考虑到鼠标和键盘两种:而当时的鼠标事件,其实就是 click.mousedown.mouseup 等等的事件.但是当手机.平板开始流行时候,再移动装置上的主 ...
- backface-visibility 3D修复
backface-visibility 是作用于 3D transform 时候 默认是 backface-visibility: hidden; 当一个元素3D变换的时候,会立即看到背 ...