.net编译之后的程序集有二种存在形式:分别为.exe与.dll
一、Basic Class Library BCL基础类库
mscorlib.dll
二、框架类库 FCL
BCL是FCL的一个子集
三、CTS公共类型系统
四、即时编译 Just-In-time compilation
静态编译:在程序执行前全部被翻译为机器码;反之动态编译是一句句执行翻译,边运行变翻译
值类型与引用类型
(1)继承、均集成自System.Object类,不同之处,几乎所有的引用类型都是直接从System.Object直接继承,值类型则从System.Object的子类System.ValueType继承。
(2)内存分配 引用类型挡在托管堆上,托管栈将引用托管堆;值类型在运行时(托管栈)分配
引用类型如:string,Object,class等总是在从托管堆上分配的,C#中new操作符返回对象的内存地址–也就是指向对象数据的内存地址。
拆箱与装箱就是值类型与引用类型的转换,其是值类型和引用类型之间的桥梁。之所以可以这样转换是因为C#所有类型都源自Object(所有值类型都源于ValueType,而ValueType源于Object)。
注意字符串在修改时,是在堆上创建一个新的对象,然后将栈上的字符串指向新的对象(旧的对象变为垃圾等待GC回收)。字符串的值是无法被修改的(具有不变性)。考虑使用StringBuilder来防止建立过多对象,减轻GC压力。
字符串的不变性指的是字符串一经赋值,其值就不能被更改。当使用代码将字符串变量等于一个新的值时,堆上会出现一个新的字符串,然后栈上的变量指向该新字符串。没有任何办法更改原来字符串的值。
字符串驻留是CLR的JIT做代码优化时,CLR会维护一个字符串驻留池(内部哈希表),并在新建字符串时,探查是否已经有相同值的字符串存在。只有以下两种情况才会自动探查。