C# 释放资源的规范写法
static class CSharp_3 {
/* ----------------------------------------
* 以下学习资源的释放:IDispose和析构函数
* 1、IDispose
* 2、析构函数
* 一般情况下,最好的方法是实现这两种机制,获得这两种机制的优点,克服其缺点。因此最好是我们实现两种机制。
* ----------------------------------------
*/
[STAThread]
static void Main() {
//示例如下:
MyResourceClass sampleObject = new MyResourceClass();
//....................
//释放资源
sampleObject.Dispose();
sampleObject = null;
}
}
/* --------------------------------
* 释放资源例子:
* 实现两种机制确保资源能够释放
* https://msdn.microsoft.com/zh-cn/library/fs2xkftw(v=vs.110).aspx
* --------------------------------
*/
public class MyResourceClass : IDisposable {
/// <summary>
/// 标记是否已调用Dispose(bool)的变量
/// </summary>
private bool isDisposed = false;
/// <summary>
/// 实现的IDispose接口
/// 由于公共、非虚拟的、无参数 Dispose 方法由该类型的使用者调用,因此其用途是【释放非托管资源和托管资源】和指示终结器(如果存在)不必运行。 因此,它具有标准实现。
/// </summary>
public void Dispose() {
//释放非托管资源和托管资源
Dispose(true);
//指示终结器(如果存在)不必运行
GC.SuppressFinalize(this);
}
/*-----------------------------------------
* Dispose(Boolean) 重载:
* 参数: disposing, 是一个 Boolean,它指示方法调用是来自 Dispose 方法(其值为 true)还是来自终结器(其值为 false)。
* 主体包含两个代码块:
* 代码块1:释放非托管资源的块。 无论 disposing 参数的值如何,都会执行此块。
* 代码块2:释放托管资源的条件块。 如果 disposing 的值为 true,则执行此块。
* ----------------------------------------
*/
protected virtual void Dispose(bool disposing) {
if (!isDisposed) {
if (disposing) {
/*此处【代码块2】:释放所有的托管对象:指被CLR(公共语言运行库:dotnet运行库)控制的内存资源,常见的托管资源:
* int,
* string,
* float,
* DateTime等等,
* .net中超过80%的资源都是托管资源。
* ---
* ---
*/
}
}
else {
return;
}
/*此处:【代码块1】:释放所有的非托管对象:指CLR(公共语言运行库:dotnet运行库) 不能控制和管理的部分,如文件流,数据库连接,网络连接,GDI+,Com对象,系统的窗口句柄,打印机资源等,下面列举一下常见的非托管类型:
* ApplicationContext,
* Brush,
* Connection,
* Component,
* ComponentDesigner,
* Container,
* Context,
* Cursor,
* Stream,
* FileStream,
* Font,
* Icon,
* Image,
* Matrix,
* Object,
* OdbcDataReader,
* OleDBDataReader,
* Pen,
* Regex,
* Socket,
* StreamWriter,
* StreamReader,
* Timer,
* Tooltip
* --
*/
this.isDisposed = true;
}
/// <summary>
/// 析构函数
/// </summary>
~MyResourceClass() {
//释放非托管资源
Dispose(false);
}
/// <summary>
/// 功能示例方法
/// </summary>
public void Something() {
//判定资源是否已释放过
if (this.isDisposed) {
throw new ObjectDisposedException("MyResourceClass");
}
/*此处:添加功能代码
* ---
* ---
*/
}
}
posted on 2016-08-18 10:54 shaozhuyong 阅读(3099) 评论(0) 收藏 举报
浙公网安备 33010602011771号