CLR支持引用类型和值类型2种类型,他们在.Net类层次机构中的位置不同,其分配的内存方式也不同。
什么是值类型?
基元类型、枚举和结构为值类型,也就是继承自System.ValueType的类型被称为值类型,主要有以下几种:bool、byte、char、decimal、double、enum、float、int、long、sbyte、short、struct、uint、ulong、ushort。
什么是引用类型?
类、字符串、标准模块、接口、数组和委托为引用类型。他们继承自System.Object:class、interface、delegate、object、string。
特殊的System.Object
根类型System.Object很特殊,它既不是值类型也不是引用类型,并且不能实例化。所以值类型和引用类型可以隐式或显式的转换,也就是装箱和拆箱。
值类型和引用类型的区别
值类型 | 引用类型 | |
---|---|---|
内存分配地点 | 分配在栈中 | 分配在堆中 |
效率 | 效率高,不需要地址转换 | 效率低,需要进行地址转换 |
内存回收 | 使用完后,立即回收 | 使用完后,不立即回收,等待GC回收 |
赋值操作 | 进行复制,创建一个同值新对象 | 只是对原有对象引用 |
函数参数与返回值 | 是对象的复制 | 是原有对象的引用,并不产生新的对象 |
类型扩展 | 不宜扩展 | 容易扩展,方便与类型扩展 |