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");
}
/*此处:添加功能代码
* ---
* ---
*/
}
}
C# 释放资源的规范写法的更多相关文章
- Hibernate事务代码规范写法
----------------siwuxie095 事务相关概念 1.什么是事务 逻辑上的一组操作,构成这组操作的各个单元,要么一起成功, 要么一起失败 2.事务的四个特性 1)原子性 2)一致性 ...
- js的规范写法ES5(自己以后按照这样写)
1.引号的使用,单引号' ' 优先(如果不是引号嵌套,不要使用双引号) 正常情况:console.log('hello there') 双引号转码: $("<div cl ...
- [转] HTML中调用JavaScript的几种情况和规范写法
比较简单,基础. 一.引用外部文件中的js脚本 <script type="text/javascript" src="ext.js"></s ...
- @Html.xxxxxFor() 规范写法
@Html.TextBoxFor() 讲解(其他类似的 @Html.LabelFor 等)同理 @Html.TextBoxFor(model => model.SearchParams.Name ...
- AMD,CMD,UMD 三种模块规范 写法格式
一下三块均以 foo.js 为示例文件名,以 jQuery,underscore 为需求组件 ADM:异步模块规范, RequireJs 的支持格式 // 文件名: foo.js define(['j ...
- iOS-@inerface的11条规范写法
总结一些interface声明时的规范,相关宏的介绍,定义方法时有用的修饰符,编写注释的规范,最终写出一个合格的头文件. 1.读写权限 1.1实例变量的@public,@protected,@priv ...
- @inerface的11条规范写法
总结一些interface声明时的规范,相关宏的介绍,定义方法时有用的修饰符,编写注释的规范,最终写出一个合格的头文件. 1.读写权限 1.1实例变量的@public,@protected,@priv ...
- angular.js规范写法
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- HTML中调用JavaScript的几种情况和规范写法
JavaScript执行在html中,引用有几种方式? 我知道的方法有3种: 第一种:外部引用远程JavaScript文件.如<script type="text/javascript ...
随机推荐
- Go - 指针简介 与 ++/--运算符以及控制语句
指针 Go 语言中,对于指针有一些特殊约束: 1. 不在支持 “->” 符号,所有的指针使用“.” 来操作指针对象的成员变量 2. 指针的默认值为 “nil” ++ 与 -- 作为语句而非表达式 ...
- cache的作用
cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取. 如果使用jquery,可以使用 cache参数来控制 $.ajax({ url: " ...
- C 语言 - Unicode 解决中文问题
问题: 打印一句中文 #include <stdio.h> int main() { char str[] = "你好,世界"; printf("%s\n&q ...
- 11.solr学习速成之MoreLikeThis
Solr相似匹配 在网页搜索或电商产品搜索结果页面,很多时候会看到一个相似文档.相似产品或找相似的链接.Solr 使用 MoreLikeThisComponent(MLT)和 MoreLikeT ...
- Zookeeper的几个应用场景
场景一 有这样一个场景:系统中有大约100w的用户,每个用户平 均有3个邮箱账号,每隔5分钟,每个邮箱账需要收取100封邮件,最多3亿份邮件需要下载到服务器中(不含附件和正文).用20台机器划分计算的 ...
- linux中awk工具
awk sed以行为单位处理文件,awk比sed强的地方在于不仅能以行为单位还能以列为单位处理文件.awk缺省的行分隔符是换行,缺省的列分隔符是连续的空格和Tab,但是行分隔符和列分隔符都可以自定义, ...
- Django 使用体会
最近急于赶项目,少有更新博文.如今项目大致不那么赶了,终于可以在晚上码字码文章,而不是码代码了. 从开始使用Django开发到现在, 也已经有大半年了.公司的项目也是逐步地加功能,加模块,一步步完善设 ...
- 网络编程基础之Socket套接字简单应用
一.Socket套接字实现通信循环 所谓通信循环,简单理解就是客户端可以给服务端循环发送信息并获得反馈的过程. 1.基础版 通信循环的程序分为两部分,即两个python模块,分别为客户端.py和服务端 ...
- java web 读取配置文件两种方法
package com.tsinghua.getDataBaseConn; import java.io.IOException;import java.io.InputStream;import j ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第十一周
java学习第十一周 本周,进行了java集合方面的知识,在博客园的帮助下,我的课前预习更有条理性,重点明确,本周的课堂反应明显更好了,首先,梳理一下本周知识点. Collection ...