c#中托管与非托管的理解分析

本文详细解释了C#中的托管代码和非托管代码的概念。托管代码在公共语言运行库(CLR)中运行,享受内存管理、安全等服务;而非托管代码直接编译为机器码,不依赖CLR,需要手动管理资源。C#项目可以创建托管和非托管程序,非托管资源通常涉及系统调用,如网络连接、数据库和文件流,需要使用using关键字确保资源释放。
摘要由CSDN通过智能技术生成

第一步:抛定义

C#托管代码是什么?

        托管代码(Managed Code)实际上就是中间语言(IL)代码。代码编写完毕后进行编译,此时编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。程序集(Assembly)的文件负责封装中间语言,程序集中包含了描述所创建的方法、类以及属性的所有元数据。
        托管代码在公共语言运行库(CLR)中运行。这个运行库给运行代码提供了多种服务,通常来说,公共语言运行库可以加载和验证程序集,并以此来保证中间语言的正确性。当某些方法被调用时,公共语言运行库把具体的方法编译成适合本地计算机运行的机器码,并且将编译好的机器码缓存起来,以备下次调用时使用。这个过程就是即时编译。 
注意:程序实际上是被“托管”在公共语言运行库中。随着程序集的运行,公共语言运行库会持续地提供各种服务,例如内存管理、安全管理、线程管理等等。


总结:托管代码(Managed Code)是由公共语言运行库(CLR)执行的代码,而不是由操作系统直接执行。托管代码也可以调用CLR的运行库服务和功能,比如GC、类型检查、安全支持等等。这些服务和功能提供独立与开发语言的、统一的Managed Code应用程序行为

C#非托管代码是什么?

        非托管代码(Unmanaged Code)是指直接编译成目标计算机的机器码,这些代码只能运行在编译出这些代码的计算机上,或者是其他相同处理器或者几乎一样处理器的计算机上。

        非托管代码不能享受公共语言运行库所提供的一些服务,例如内存管理、安全管理等。 如果非托管代码需要进行内存管理等服务,就必须显式地调用操作系统的接口,通常非托管代码调用Windows SDK所提供的API来实现内存管理。 非托管程序也可以通过调用COM接口来获取操作系统服务。 注意:C#跟Visual Studio平台的其他编程语言不一样的是,C#可以创建托管程序与非托管程序。当创建的项目选择名字以MFC,ATL或者Win32开头的项目类型,那么这个项目所产生的就是非托管程序。

 总结:非托管代码(Unmanaged Code)不由CLR公共语言运行库执行,而是由操作系统直接执行的代码。
————————————————
版权声明:本文为CSDN博主「疯狂的小牛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010272085/article/details/50703652

第二步:谈理解

        非托管类型主要讲的是使用引用类型的代码,需要将我们书写的代码转换成中间语言代码,再转换成机器代码,从而实现其功能,因为引用类型的变量存储是对其数据(对象)的引用。对于引用类型,两个变量可引用同一对象(栈上有两个变量同时指向堆内存里的对象)

        我的理解是只要代码里包含了引用类型的相关数据(追根溯源之后,只要有使用过引用类型成员)都可以认为是非托管代码。

        托管类型主要是使用值类型的的代码,这种类型可以直接将我们书写的代码直接转换成机器代码执行而不需要转换,因为值类型的变量直接包含其数据。对于值类型,每个变量都具有其自己的数据副本(就是说值类型的每个实例对象都是各存各的数据),对于一个变量执行的操作不会影响另一个变量(in,ref和out参数变量除外)

        我的理解是单纯只是使用值类型成员的代码都可以是托管代码。(个人理解,不对的地方可以留言)

第三步:说使用

        简单理解:能被自动回收的就是托管(被CLR管理,托管堆就是被CLR管理的堆),不能被自动回收的就是非托管(我们都知道引用类型的引用目标都在堆里,值类型的值在栈里)。

        重点延申:网络连接,数据库连接,文件流属于系统资源,我们对这种情况的使用都是在栈里,而栈又没有自动回收机制,但三种方式都需要耗费大量的栈内存,因此,我们需要使用using关键词来手动强制释放内存资源。

        using关键词的功能:使用了using关键词,它就可以跟踪非托管资源周期内的活动,一旦发现非托管资源生命结束了,就会强制使用dispose方法去释放放在该作用域的非托管资源的内存。

using(sqlConnection con=new sqlConnection(constr))
{
    ........
}


using(streamWriter=new FileStream())
{
    ........
}

博文就到此为止啦,如果你觉得有用的话就给博主点个赞吧!如果你还有其他疑惑,可以留言博主,博主愿意为你服务哦!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值