1、值类型、引用类型
值类型,包括struct、enum、以及基本数据类型(int,char等),值类型是创建在线程栈上。值类型都隐式派生至system.valueType。
引用类型,包括class、string、array等,引用类型创建在托管堆上,由gc负责清理。
这篇文章讲的比较详细:http://www.cnblogs.com/siqing99/archive/2012/04/03/2430918.html
string是一种特殊的引用类型,是一种不可变的引用类型。
String str1 = "abc";
String str2 = "abc";
CLR使用了一种叫字符串驻留的技术,当CLR初始化时,会创建一个内部的散列表,其中的键为字符串,值为指向托管堆中字符串的引用。刚开始,散列表为空,JIT编译器编译方法时,会在散列表中查找每一个文本常量字符串,首先会查找"abc"字符串,并且因为没有找到,编译器会在托管堆中构造一个新的指向"abc"的String对象引用,然后将"abc"字符串和指向该对象的引用添加到散列表中。接着,在散列表中查找第二个"abc",这一次由于找到了该字符串,指向同一个String对象的引用会被保存在变量str2中,到此str1和str2指向了同一个引用。
String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。
2、boxing与unboxing
参见:http://www.csharpwin.com/csharpspace/7709r6892.shtml