为什么我们有时候用 using(SqlConnectionconn=newSqlConnection(constr))

时间:2022-02-22 05:47:18

理解托管和非托管代码的前提之下,,要先了解CLR(大众语言运行库)

.Net Framework 是由相互独立又相关的两部分构成:CLR 和 类库, CLR是它为我们供给的处事,类库是它实现的成果.
.NET的大部分特性----垃圾收集,版本控制,线程打点等,都使用了CLR供给的处事

当你为.NET Framework编译源代码的时候,得到的方针代码不是CPU能识另外机器指令,而是一种叫做"微软中间语言(MSIL,或简称为IL的代码)"的新语言.CLR供给了一个实时编译器,
用来把IL代码编译为本机机器代码.这样一来,CLR能够使代码变得可移植,因为.NET应用措施的源代码必需被编译为IL代码,这些IL代码可以运行在任何供给CLR处事的平台上.从CLR的角度来看,
所有的语言都是平等的,只要有一个能生成IL代码的编译器就行,这就确保了各类语言的互操性. managed code-托管代码
由大众语言运行库(CLR)环境(而不是直接由操纵系统)执行的代码。托管代码应用措施可以获得大众语言运行库处事,例如自动垃圾回收、运行库类型查抄和安适撑持等。
这些处事辅佐供给独立于平台和语言的、统一的托管代码应用措施行为。

Unmanaged Code - 非托管代码

在大众语言运行库环境的外部,由操纵系统直接执行的代码。非托管代码必需供给本身的垃圾回收、类型查抄、安适撑持等处事;它与托管代码差别,后者从大众语言运行库中获得这些处事。

 

分类: c#根本常识

 

 

 

 

能被自动回收的就是托管.不能被自动回收的就长短托管.系统的对象就是托管的.

.net的堆就是托管堆.没有非托管堆.引用类型的引用方针就是在堆里.

值类型的值就在栈里.

所谓的系统资源.是指:网络连接,数据库连接.文件流.这种对象.

这里的托管就是指被CLR打点,托管堆就是被CLR打点的堆。非托管资源需要手动释放,托管资源由GC帮你打理。

保举园子里的一篇博文:对付托管资源和非托管资源的理解

我感受你可以从using关键字入手,为什么我们有时候用

using(SqlConnection conn=new SqlConnection(constr))

{...}

using(Streamstreamwrite=new FileStream()

{...}

这种代码写数据库连接,对stream的操纵。

就是因为这些资源长短托管资源无法被GC自动释放,需要手动强制释放,怎样使动释放呢?using就有这种成果,它可以跟踪非托管资源周期内的勾当,一旦发明非托管资源生命结束了,就会强制挪用dispose要领去释放在该感化域的非托管资源的内存。你去对照下java和.net垃圾回收机制和了解下C#值类型、引用类型、仓库、托管堆的一些根本理论,然后把这些再联系起来想想应该能得到你想要的答案了,本身想大白的工作才华完全消化进去。