一、值类型和引用类型的区别
值类型 | 引用类型 |
一般在线程栈上分配 | 必须从托管堆中分配,且从托管堆分配对象时,可能强制执行一次垃圾回收 |
值变量赋值是进行数据传递,两个值变量互不影响 | 引用类型赋值仅仅是把对象的引用指针赋值给变量,两个变量之间互相影响 |
值类型都继承自System.ValueType | 引用类型都不继承自System.ValueType |
不受垃圾回收的控制 | 受垃圾回收的控制 |
简单类型(int,byte,char,float,decimal,bool) 枚举类型 结构类型 |
类类型 接口类型 数组类型 委托类型 |
二、装箱和拆箱
装箱是指将一个值类型转换为引用类型的过程
拆箱是指将一个引用类型显式地转换成值类型
装箱做了那几件事?
1)、在托管堆中分配内存(内存量=值类型个字段所需要的内存量+类型对象指针和同步块索引的内存量)。
2)、值类型的字段复制到新分配的堆内存。
3)、返回对象地址。
拆箱做了那几件事?
1)、根据指针获取该指针指向包含一个对象中的原始值类型。
既然装箱做了这么多的事情,所以我们要斟酌使用,多数情况使用泛型来应对,一个方法试用于多种类型的情况。
三、new关键词做了几件事情
1)、计算字节总数(计算类型及其所有基类型中定义的所有实例字段需要的字节数+每个对象的类型对象指针和同步块索引需要的字节数。
2)、从托管堆中分配类型要求的字节数,从而分配对象内存,分配的所有字节都设为0。
3)、初始化对象的类型对象指针和同步块索引
4)、调用类型的实例构造器,传递new调用中指定实参(如果有)。ps:大多数编译器都在构造器中自动生成代码来调用基类构造器,每个类型的构造器都负责初始化该类型定义的实例字段,最终调用System.Object的构造器,该构造器什么也不做,简单的返回对象指针。