第一次读写写读后感:(如果有错请告知,小弟立马修改)
第一章(1)
执行程序的代码
c# 的代码(托管代码)到cpu指令 需要经过,CLR(公共语言运行库)的检测引用类型,再由JIT编译器找到对应该方法的IL,分配内存块,将IL编译成为CPU指令存入内存块.然后修改对应的条目,能指向这些内存块,跳转到内存块的本机代码.
其中,托管代码和非托管代码的区别:
非托管代码:也叫本地(native)代码.
托管代码:是由公共语言运行库(CLR)执行的代码,而不是由操作系统直接执行。本地代码经过两次编译,第一次将源代码编译成中间代码(MSIL,MicrosoftIntermediate Language),第二次由.net中的CLR将中间代码编译成机器代码。程序实际上是被“托管”在公共语言运行库中。随着程序集的运行,公共语言运行库会持续地提供各种服 务,例如内存管理、安全管理、线程管理等等。和托管资源/非托管资源不同,不要弄混。
————————————————
版权声明:本文中托管代码和非托管代码为CSDN博主「_kangzai」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/z2516305651/article/details/93421861
再加点:托管代码中的进程可以运行多个应用程序,减少进程数,从而增加性能,减少资源,而且健壮性不变.
代码优化
然后JIT如果对同样的方法做过处理,就可以直接跳过,然后直接执行内存块种的代码.
CLR会对JIT的本机代码会进行优化,(Release)会,而(Debug)不会,
IL和验证
IL是基于栈,(先进后出),再编译成为CPU指令的时候,CLR会执行一个验证的过程,确保代码正确(和VSStudio的代码验证是不同的,没有应该,一个是代码的健全性验证,另外个验证方式差不多,但是所在环节不同.这里打个问号?)
验证后的结果是可以放到虚拟内存地址,可以不互相干扰,也可以正确的访问到内存.
不安全的代码
不安全的代码可以直接操作内存地址,并处理这些地址的字节,只有在
- 非托管代码进行操作,
- 提升效率要求极高的一个算法的性能
(基本上和我绝缘了)
要求添加unsafe关键字,才可以编译,PEVerify.exe可以检测
本地代码生成器:NGen.exe
这个通常是用来再安装到用户计算机上的时候,将IL编译成本机代码.因为是安装编译好了就不用了在编译了,(减少了重复工作)主要作用
- 提高应用程序的启动速度
- 减少应用程序的工作集
大概就是它生成一个本机代码,然后CLR加载的时候就直接加载了
但有如下问题:
- 没有知识产权保护
- 生成的文件可能失去同步
- 较差的执行时性能:生成比较差的代码
补充:通常用在客户端.大型客户端可以用MPGO.exe来分析程序执行,从而更好的优化.
Framework类库
额,,,,这个就是调用下dll,好运.
CTS通用类型系统
就是说微软和ECMA有屁眼交易.
- 字段Field:作为对象状态一部分的数据变量.字段根据名称和类型来区分(思考下:是不是public string Name,类型string,名称Name)
- 方法Method:针对对象执行操作的函数,通常会改变对象状态.有一个名称,一个签名,一个多个修饰符,签名指定了参数的数量,类型,方法是否有返回值;(public string SetthisName(string Name)
- 属性Property:对于调用者,属性就像是字段,但对于实现者,属性像是一个方法(get,set)
这里塔逼一句(说句逼话)属性,字段,变量的区别
- 事件(Event):对于前端的同学比较晓得多就是按钮点击事件
所有类型最终必须从预定义的System.Object类型继承
- 比较相等性
- 获取哈希码
- 查询一个实例的真正类型
- 执行实力的浅拷贝
- 获取实例对象当前状态的字符串表示