CLR IN C# 笔记
CLR IN C#这本书来来回回的看。有些东西记住了。有些东西没记住。(没记住就白看)
从今天开始每天看一点点,避免自己看的没耐心了。也把看到的东西记下来,就算已经记住的也记下来,谁他娘的知道我啥时候又忘记
一个重要的概念
IL代码—c#代码编译后生成的代码,由CLR负责执行IL代码
“引用类型必须时时刻刻考虑到性能问题”
is 和 as 操作符
is操作符永远不会抛出异常,is会检查对象是否兼容与制定类型,并返回true或false
is操作符的常规用法
if(o is myObject) myObject mo= (myObject)o;
这样写会影响性能因为:
1.is操作符会首先核实o是否兼容与myObject
2.如果是,在if语句内部会再次核实o是否引用一个myObject
as 操作符的常规用法,以及对上面写法的性能优化
myObject mo = o as myObject if(mo != null) { //todo }
as操作符的工作方式与强制类型转换一样,只是他永远不会抛出异常。如果转换成功返回指定对象的引用,如果失败返回NULL
基元类型、值类型、引用类型。
基元类型:编译器直接支持的类型为基元类型。(这个基元类型感觉作用不是很大,至少在编程中体现的不是很明显,仅仅是作为一个概念存在)
引用类型:
使用引用类型必须清楚的知道四个事实
- 内存必须从托管堆中分配
- 堆上分配的每个对象都有额外成员,这些成员必须初始化
- 对象中的其他字节总是为零
- 从托管堆中分配对象时,可能进行一次垃圾回收
相对于引用类型,值类型能够提供更好的性能,但是也要遵循以下原则
- 类型具有基元类型的行为。也就是说,十分简单的类型,没有成员会修改类型的任何实例字段。对于许多值类型都建议将字段标记为readonly(字典类可以考虑用结构而不是类)
- 类型不需要从其他任何类型继承
- 类型也不需要派生其他类
- 类型的实例较小16字节或更小
- 类型的实例较大,但不作为方法实参传递,也从不方法返回
第5点应该是针对第4点的补充说明。我们都知道引用类型在栈中保存的是堆中的一个地址。对象与对象赋值其实是把一个对象的地址给了另一个对象(所以叫引用类型),但是值类型会确确实实把一份一模一样的数据在栈中复制一份,这个开销就夸张了
所以有了第4点和第5点的补充说明
浙公网安备 33010602011771号