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 阅读(3073) 评论(0) 编辑 收藏 举报