C#精髓【月儿原创】第一讲 使用垃圾回收器
说明:准备出一个系列,所谓精髓讲C#语言要点。这个系列没有先后顺序,不过尽量做到精。可能会不断增删整理,本系列最原始出处是csdn博客,谢谢关注。
C#精髓
第一讲 使用垃圾回收器
作者:清清月儿
主页:http://blog.csdn.net/21aspnet/ 时间:2007.3.22
内存有限,所以必须在不被占有的时候回收。
方法结束时值类型容易销毁。引用类型就不同。
析构函数~+类名;垃圾回收时执行任何整理。可以在任何线程上执行。
析构函数的限制:
1.不能在struct上声明;
2.不能有访问修饰符例如public;
3.不能带参数也不能接受参数,所以不可被重载,所以一个类最多一个析构函数;
4.析构函数是被自动调用,不可显示调用,不可被继承。
5.析构函数声明的标识符必须是类名;
6.析构函数声明包括extern修饰符时称外部析构函数,不提供任何实际的实现,函数体由一个分号组成。
7.非外部析构函数都都包含一个块。
任何代码不再使用某实例时,该实例就符合销毁条件。
销毁实例按照从派生程度最大到最小的顺序,调用继承链中的各个析构函数。
析构函数实际是重写了System.Object中的虚方法Finalize.
C#中永远不能亲自摧毁对象
垃圾回收器的保证:
每个对象都被摧毁;
每个对象都只被摧毁一次;
每个对象只有在该对象不存在任何引用才会摧毁;
目的:让程序员告别麻烦又易出错的清理工作。
可以调用静态方法System.GC.Collect()垃圾回收器;
但不建议这么做;
只有对象垃圾回收时才运行析构函数。含有析构函数的类会使代码和回收过程复杂影响性能。
更好的方法:
disposal方式--亲自释放
TextReader reader =new StreamReader(filename)
try{
string line;
while((line=reader.ReadLine())!=null)
{Console.Write(line);
}
finally{
reader.Close();
}
但这样做并不完美:
1.dispose多个资源会变得难以控制。
2.有时要修改代码(finally块中的引用不能为null)
3.不能创建解决方案的一个抽象,这意味方案难以理解,而你必须在需要该功能的任何地方重复代码。
4.对资源的引用保留在finally块之后的作用域中,这意味着可能不小心试图使用一个已经释放的资源。
using就是为解决这些而设计的;
可以将using语句作为一种明确异常安全的可靠的方式来保证一个资源总是被自动释放。这解决了人工try/finally中存在的问题。
需要dispose多个资源时有良好的扩展性;
不影响程序代码的逻辑;
对问题进行良好的抽象,避免重复性代码;
非常可靠;
注意此using非引入命名空间的using.
此using语法是
using(type variable=initialization) embeddedStstement
确保DataReader绝对Close
using(SqlDataReader dr=...)
{
if(dr.HasRows)
{
while(dr.Read())
{...}
}
}
using语句获取一个或多个资源,执行一个语句,然后处理这些资源。资源是实现IDisposable接口的类或结构。
正在使用资源的代码可以调用Dispose释放,如果不调用会由垃圾回收器处理。
using语句声明的局部变量【只读,不可ref out】,表达式必须是实现了IDisposable接口或可以隐式转化为IDisposable的一个类型。
using语句:获取-使用-处置
从析构函数中调用Dispose方法也许能保证它总是运行。
class Example:IDisposable
~example(){
Dispose();
}
public virtual void Dispose();
{
if(!this.disposed){
try{
//在此释放稀缺资源
}
finally{
this.disposed=true;
GC.SuppressFinalize(this);
}
}
}
public void SomeBehavior()//示例方法
{
checkifdisposed();
}
...
private void checkifdisposed(){
if(this.disposed)
{
throw new ObjectDisposedException("Example");
}
}
private Resource scarce;
private bool disposed=false;
}
注意
1.类实现了IDisposable
2.析构函数调用Dispose
3.Dispose方法是public可以随意调用
4.Dispose方法可以安全的多次调用。变量disposed指出方法以前是否运行过,只有第一次运行才会释放稀缺资源
5.Dispose方法调用静态的GC.SuppressFinalize方法。该方法防止垃圾回收器在这个对象上调用析构函数,因为对象现在已经finalized
6.类的所有常规方法都要检查对象是否disposed如果是就抛出异常
相关文章:

5GtoB即将迎来规模商用,如何共创行业新价值?
4月14日,在华为公司第18届全球分析师大会期间,华为携手运营商代表、产业界代表举办了“5G激发行业新价值”论坛,与行业分析师、金融分析师共同探讨对5GtoB产业未来的展望、创新解决方案以及最佳业务实践。 5G发展进入快车道,融合…

$.ajax上传文件或者上传图片
2019独角兽企业重金招聘Python工程师标准>>> ###FormData 想得到一个FormData对象就必须new一个FormData对象,然后使用append()方法向该对象里添加键值对 var formdata new FormData() //包含用户选择文件的文件流 formdata.append("file",ev…

BMP图形文件分析类(c#)
1using System; 2using JJBase.FILE; 3namespace JJBase.Image 4{ 5 /**//// <summary> 6 /// BMP 的摘要说明。 7 /// </summary> 8 public class BMP 9 { 10 11 public BMP() 12 { 13 // 14 …

gsoap 学习 1-由wsdl文件生成h头文件
开始前先看一下用户向导吧 http://www.cs.fsu.edu/~engelen/soap.html 中左侧点击Documentation 英语水平确实有限,有些内容可能说的不准确,敬请参考向导中原文,以免误导 向导 1.1节中提供了gSoap开发包的下载地址http://sourceforge.net/projects/gsoap2 下载最新gSoap程序包解…

微软每年豪砸安全研发 10 亿美元,聊聊背后的技术密码
从无序中寻找踪迹,从眼前事探索未来。正值 IT 黄金十年新开端, CSDN 欲以中立技术社区专业、客观的角度,深度探讨中国前沿 IT 技术演进,现在推出年度重磅企划——「拟合」,通过对话企业高管大咖,跟踪报道企…

phpstudy多站点配置好后index of/ 列表无法出现的解决
打开配置文件vhost-conf,看到图中画黄色线部分。把新配置的站点中的options后面加上 Indexes 就行了。 转载于:https://www.cnblogs.com/wubuwei/p/7388700.html

【OSX】build AOSP 2.3.7时的build error解决
原始的error log: 1 2 PLATFORM_VERSION_CODENAMEREL3 PLATFORM_VERSION2.3.74 TARGET_PRODUCTgeneric5 TARGET_BUILD_VARIANTeng6 TARGET_SIMULATOR7 TARGET_BUILD_TYPErelease8 TARGET_BUILD_APPS9 TARGET_ARCHarm 10 HOST_ARCHx86 11 HOST_OSdarwin 12 HOST_BUIL…

undefined reference to 'pthread_create'
pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库。源文件,不要忘了加上头文件#include<…

瞄准自然语言处理,百度与鹏城实验室共建实验室
4月16日,百度与鹏城“自然语言处理联合实验室”签约暨揭牌仪式在鹏城实验室举行。 中国工程院院士、鹏城实验室主任高文出席仪式并致辞,鹏城实验室人工智能研究中心主任李革教授和百度集团首席技术官王海峰代表双方介绍了联合实验室前期筹备情况并签署协…

PostgreSQL SQL 语言:并行查询
本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权。 1. 并行查询如何工作 当优化器判断对于某一个特定的查询,并行查询是最快的执行策略时,优化器将创建一个查询计划。该计划包括一个 Gather 节点。下面是一个简单的例子ÿ…

常用的linux的命令行操作
2019独角兽企业重金招聘Python工程师标准>>> 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT …

Python 极简实现 IoU
来源 | 简明AI头图 | 下载于视觉中国出品 | AI 科技大本营(ID:rgznai100)IOU中文名叫交并比,见名知意就是交集与并集的比值。是在目标检测中常用的算法。IoU原理如上图所示,就是计算上面阴影部分与下面阴影部分的比值。…

静态页htm传参数
//从转向过来的URL中截取参数 开始function SplitUrl(key){var fstrkey;var getstr;var urldocument.URL.toString();urlurl.toLowerCase();//转为小写var locurl.indexOf(fstr);if(loc>0){getstrurl.substring(locfstr.length,url.length);return getstr;}else{return &quo…

vue router 入门笔记
vue router 入门笔记 tips: components优先级大于component,即当一个route对象里同时配置了component和components时component视为无效即使route对象有name属性,也要配置一个path属性。name属性只是配对用的,path是要直接打到url上…

用C#的Raw Socket实现网络封包监视
<script language"javascript" src"/ad/js/edu_left_300-300.js" type"text/javascript"></script> 谈起socket编程,大家也许会想起QQ和IE,没错。还有许多网络工具如P2P、NetMeeting等在应用层实现的应用程序…

人工智能是否能开启人类世界新纪元?
想必许多人都不止一次地幻想过,当人工智能发展到极限时,它将为我们的生活带来多少触手可及的便捷,或是意想不到的惊喜呢?试想一下我们身处英剧《黑镜》的世界中,人类的生活里充斥着人工智能对社交行为的各种评分机制&a…

1月国内操作系统市场:Windows XP份额高达60.84%
IDC评述网(idcps.com)02月21日报道:据CNZZ数据,在国内操作系统市场上,2014年1月份,微软Windows系统依旧称霸市场,份额为90.63%,环比去年末下滑0.57%。对于市场份额下滑一事ÿ…

17.08.17
控制文件 丢失部分控制文件: SQL> select * from v$controlfile; $ >/u01/app/oracle/oradata/orcl/control01.ctl SQL> select * from v$tablespace; 报错 SQL> alter system checkpoint; 报错 $ vi /u01/app/oracle/diag/rd…

用C#实现基于TCP协议的网络通讯
TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程。然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实现不是一天两天的功夫,所幸…

Java NIO系列教程(二) Channel
为什么80%的码农都做不了架构师?>>> Java NIO的通道类似流,但又有些不同: 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。通道可以异步地读写。通道中的数据总是要先读到一个Buffer࿰…

百度CTO王海峰博鳌解读AI“融合创新”,算力算法数据发挥综合作用
4月18至21日,博鳌亚洲论坛2021年年会在海南博鳌举行。19日下午,百度CTO王海峰受邀参加本届博鳌年会“后疫情时代的人工智能”为主题的圆桌论坛。与公钥加密技术之父、图灵奖得主惠特菲尔德迪菲,阿斯利康公司董事长雷夫约翰森等多位专家和企业…

Java开发工具(Eclipse中内容辅助键的使用)
* A:Alt/ 起提示作用* B:mainalt/,sysoalt/,给出其他提示* C:补充输出语句,选中需要输出的部分,alt/选择最后一项即可* C:定义自己的alt / * windows--perference-Java-Editor-Templates--New * A:新建 ctrl n(new)* B:格式化 ctrlshiftf(format)* C:导入包 ctrlshifto *…

常用的css3的新属性
2019独角兽企业重金招聘Python工程师标准>>> 作为前端开发人员,如果你还不知道或还没有接触过CSS3,那么你真的OUT了!就像蒸汽机的发明标志工业革命的开始一样,CSS3和HTML5的出现,将会带来WEB前端开发以及互…

高效分页存储过程
存储过程与页面调用如下: CREATE PROCEDURE search_sptblName varchar(255), -- 表名 strGetFields varchar(1000) *, -- 需要返回的列 fldName varchar(255), -- 排序的字段名 PageSize int 10, -- 页尺寸 PageIndex int , -- 页码 doCount bit 0, -- 返回记录…

2020年企业业务营收同比增长23.0%,华为的数字化转型实践之道
近日,在华为分析师大会期间,华为举办“共创行业新价值”主题峰会,与来自全球的400多名行业分析师、财经分析师、各行业意见领袖及媒体现场参会,分享了对行业趋势的洞察,解决方案在具体行业场景中的实践与探索ÿ…

Neo4j - CQL简介
CQL代表Cypher查询语言。 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言。 Neo4j CQL - 它是Neo4j图形数据库的查询语言。它是一种声明性模式匹配语言它遵循SQL语法。它的语法是非常简单且人性化、可读的格式。常用的Neo4j CQL命令: NO.CQL…

String.Format格式说明
C#格式化数值结果表 字符 说明 示例 输出 C货币string.Format("{0:C3}", 2)$2.000D十进制string.Format("{0:D3}", 2)002E科学计数法1.20E0011.20E001G常规string.Format("{0:G}", 2)2N用分号隔开的数字string.Format("{…

Azure 中国四年扩容 12 倍还不够,微软放话:全球每年新建 50-100 数据中心!
作者 | 伍杏玲出品 | AI科技大本营(ID:rgznai100)数据已渗透到我们生活和工作的方方面面,如今全球正处于经济发展转型与变革的关键时期,数据作为数字经济的核心生产要素,无疑建设先进的数据中心是科技企业的硬核 IT 实…

.NET中多线程的使用
为什么80%的码农都做不了架构师?>>> 1、不需要传递参数,也不需要返回参数。启动一个线程最直观的办法是实用Thread类。 2、ThreadStart类型的委托,这个委托制定了线程需要执行的方法:method。ThreadStart这个委托定义…

[数位dp] spoj 10738 Ra-One Numbers
题意:给定x、y。为[x,y]之间有多少个数的偶数位和减去奇数位和等于一。个位是第一位。 样例: 101-01 所以10是这种数 思路:数位dp[i][sum][ok] i位和为sum 是否含有前导0. 然后就是由于有负数 所以依据范围把0设置为100 然后最后和等于101则为…