以下是代码:

 /// <summary>
/// Dispose Pattern
/// </summary>
/// <remarks>
/// 由逻辑可知:
/// 1.不管是手动调用Dispose方法还是系统自动调用析构函数,均会执行【非托管资源】释放程序
/// 2.系统自动调用析构函数时,不会执行【托管资源】释放程序
/// </remarks>
public class DisposableObject : IDisposable
{
/// <summary>
/// 获取或设置一个值。该值指示资源已经被释放。
/// </summary>
private bool _disposed; /// <summary>
/// 执行与释放或重置非托管资源相关的应用程序定义的任务。
/// </summary>
public void Dispose()
{
Dispose(true); // 指示GC不要调用此对象的Finalize方法
GC.SuppressFinalize(this);
} /// <summary>
/// 关闭此对象使用的所有资源。
/// </summary>
/// <remarks>
/// 1.有时候特定的名称比Dispose更合适,比如文件封装,网络连接封装等
/// 2.此方法不要设计为 virtual,子类不应该重写该方法。
/// </remarks>
public void Close()
{
Dispose();
} /// <summary>
/// 由终结器调用以释放资源。
/// </summary>
~DisposableObject()
{
Dispose(false);
} public void DoSomething()
{
if (_disposed) throw new ObjectDisposedException("无法访问已经释放的资源。");
// TODO somethings
} /// <summary>
/// 执行与释放或重置非托管资源相关的应用程序定义的任务。
/// 派生类中重写此方法时,需要释放派生类中额外使用的资源。
/// </summary>
protected virtual void Dispose(bool disposing)
{
if (_disposed)
{
return;
} if (disposing)
{
// TODO 清理托管资源
} // TODO 1.清理非托管资源 2.将大对象{一个对象如果超过85000byte(经验值),那么将会被分配到大对象堆上(LOH:large object heap)}设置为null _disposed = true; // 标记已经被释放。
}
}

运行示例:(你可以编辑框中的代码,体验运行效果)

.NET Dispose模式的实现的更多相关文章

  1. C#中标准Dispose模式的实现与使用(条目17 实现标准的销毁模式)

    实现了Dispose模式与实现了IDisposable接口的区别就是:IDisposable的实现的可靠性(释放相关资源)要靠编程人员来解决(你确信你从来都一直调用了Dispose(Close)方法吗 ...

  2. [学习笔记] Dispose模式

    Dispose模式是.NET中很基础也很重要的一个模式,今天重新复习一下相关的东西并记录下来. 什么是Dispose模式? 什么时候我们该为一个类型实现Dispose模式 使用Dispose模式时应该 ...

  3. 第七节:使用实现了dispose模式的类型

    知道类型如何实现dispose模式之后,接下来看一下开发人员怎样使用提供了dispose模式的类型.这里不再讨论前面的SafeHandle类,而是讨论更常用的FileStream类. 可以利用File ...

  4. C#中标准Dispose模式的实现

    http://www.cnblogs.com/luminji/archive/2011/03/29/1997812.html 需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个 ...

  5. Dispose模式

    Dispose模式 Dispose模式是.NET中很基础也很重要的一个模式,今天重新复习一下相关的东西并记录下来. 什么是Dispose模式? 什么时候我们该为一个类型实现Dispose模式 使用Di ...

  6. C#的内存管理原理解析+标准Dispose模式的实现

    本文内容是本人参考多本经典C#书籍和一些前辈的博文做的总结 尽管.NET运行库负责处理大部分内存管理工作,但C#程序员仍然必须理解内存管理的工作原理,了解如何高效地处理非托管的资源,才能在非常注重性能 ...

  7. C# Dispose模式详细分析

    C#Dispose模式 目的: 为了及时释放宝贵的非托管资源和托管资源,并且保证资源在被gc回收的时候可以正确释放资源,同时兼顾执行效率 必须遵循的事实: 1 托管资源释放: 由另一线程的gc进行释放 ...

  8. [No000017B]改善C#程序的建议4:C#中标准Dispose模式的实现

    需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:不 ...

  9. [转]改善C#程序的建议4:C#中标准Dispose模式的实现

    需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:不 ...

  10. 改善C#程序的建议4:C#中标准Dispose模式的实现

    http://www.cnblogs.com/luminji/archive/2011/03/29/1997812.html 需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个 ...

随机推荐

  1. MyBatis中如何一次执行多条语句(使用mysql数据库)

    解决办法不外乎有三个:1.多条sql分批执行:2.存储过程或函数调用:3.sql批量执行. MyBatis中如何一次执行多条语句(使用mysql数据库): 1.修改数据库连接参数加上allowMult ...

  2. Mac终端配置,DIY你的Terminal (iTerm 2 + Oh My Zsh)

    使用mac osx一年以来,自带的Terminal终端一直都是白底黑字,食之无味,越来越缺乏新鲜感,怎么也得想个法子来刺激下眼球. 不然花那么多大洋买你回来是要哪般,难道真是为来学习工作??? 怎么可 ...

  3. [Python学习笔记-002] lambda, map, filter and reduce

    1. lambda lambda, 即匿名函数,可以理解为跟C语言的宏类似.例如: >>> max = lambda x, y: x if x > y else y >& ...

  4. JavaScript 片段

    js split 的用法和定义 js split分割字符串成数组的实例代码 <script language="javascript"> str="2,2,3 ...

  5. gulp学习笔记-怎样做一个gulp-demo

    第一步:在文件夹内:鼠标右键+shift  选择提示窗口中的  在此处打开命令窗口  第二步:创建npm的配置文件,在命令窗口中输入 npm init 进行npm的配置 npm init gulp-d ...

  6. CentOS MPlayer

    .准备软件 mplayer官网:http://www.mplayerhq.hu/design7/news.html RPM Fusion网址:http://rpmfusion.org/ EPEL网址: ...

  7. mac 入门操作

    1. 打开制定目录 在finder里使用command+shift+g 快捷键可以完成到达某路径的操作选中文件/目录,显示简介可以查看路径 2. home end pageUp pageDown 在苹 ...

  8. .21-浅析webpack源码之事件流this-compilation

    上一节生成Compilation实例后,添加了一些属性,随后触发this-compilation事件流,如下: Compiler.prototype.newCompilation = (params) ...

  9. Mac Hadoop的安装与配置

    这里介绍Hadoop在mac下的安装与配置. 安装及配置Hadoop 首先安装Hadoop $ brew install Hadoop 配置ssh免密码登录 用dsa密钥认证来生成一对公钥和私钥: $ ...

  10. [转]webpack4.0.1安装问题和webpack.config.js的配置变化

    本文转自:https://blog.csdn.net/jiang7701037/article/details/79403637 The CLI moved into a separate packa ...