| 值类型 | 引用类型 |
存储方式 | 直接存储数据本身 | 存储的是数据的引用,数据存储在数据堆中 |
内存分配 | 分配在栈中的 | 分配在堆中 |
效率 | 效率高,不需要地址转换 | 效率较低,需要进行地址转换 |
内存回收 | 使用完后立即回收 | 使用完后不立即回收,而是交给GC处理回收 |
赋值操作 | 创建一个新对象 | 创建一个引用 |
类型扩展 | 不易扩展,所有值类型都是密封(seal)的,所以无法派生出新的值类型 | 具有多态的特性方便扩展 |
实例分配 | 通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中 | 总是在进程堆中分配(动态分配) |
2)内存分配方面:
数组的元素不管是引用类型还是值类型,都存储在托管堆上。
引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。简称引用类型部署在托管推上。而值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实 例)存储;作为局部变量时,存储在栈上。(栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放)
3)适用场合
值类型在内存管理方面具有更好的效率,并且不支持多态,适合用做存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。