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

基元类型、值类型、引用类型。

基元类型:编译器直接支持的类型为基元类型。(这个基元类型感觉作用不是很大,至少在编程中体现的不是很明显,仅仅是作为一个概念存在)

引用类型:

使用引用类型必须清楚的知道四个事实

  1. 内存必须从托管堆中分配
  2. 堆上分配的每个对象都有额外成员,这些成员必须初始化
  3. 对象中的其他字节总是为零
  4. 从托管堆中分配对象时,可能进行一次垃圾回收

 相对于引用类型,值类型能够提供更好的性能,但是也要遵循以下原则

  1. 类型具有基元类型的行为。也就是说,十分简单的类型,没有成员会修改类型的任何实例字段。对于许多值类型都建议将字段标记为readonly(字典类可以考虑用结构而不是类)
  2. 类型不需要从其他任何类型继承
  3. 类型也不需要派生其他类
  4. 类型的实例较小16字节或更小
  5. 类型的实例较大,但不作为方法实参传递,也从不方法返回

第5点应该是针对第4点的补充说明。我们都知道引用类型在栈中保存的是堆中的一个地址。对象与对象赋值其实是把一个对象的地址给了另一个对象(所以叫引用类型),但是值类型会确确实实把一份一模一样的数据在栈中复制一份,这个开销就夸张了

所以有了第4点和第5点的补充说明

 

posted on 2017-02-05 00:27  larry_叶良辰  阅读(124)  评论(0)    收藏  举报

导航