1、浅谈值类型
值类型包括:数值类型、结构体、boolean类型、用户定义的结构体、枚举、可空类型.
值类型的变量直接存储数据,分配在托管栈中. 变量回在创建他们的方法返回时自动释放,例如在一个方法中生命Char类型的变量name=‘C’,当实例化它的方法结束时,name变量在栈上占用的内存就会自动释放.
2、浅谈引用类型
引用类型包括:数组、用户定义的类、接口、委托、object、字符串、null类型、类.
引用类型的变量持有的是数据的引用,数据存储在数据堆,分配在托管堆中,变量并不会在创建他们的方法结束时释放内存,他们所占有的内存会被CLR中的垃圾回收机制释放.
3、值类型和引用类型的区别
值类型 | 引用类型 | |
存储方式 | 直接存储数据本身 | 存储的是数据的引用,数据存储在数据堆中 |
内存分配 | 分配在栈中 | 分配在堆中 |
效率 | 效率高,不需要地址转换 | 效率底,需要地址转换 |
内存回收 | 使用完后立即回收 | 使用完后不立即回收,而是交给GC处理回收 |
赋值操作 | 创建一个新对象 | 创建一个引用 |
类型扩展 | 不易扩展,所有类型都是密封的,所以无法派生出新的值类型 | 具有多态的特性,方便扩展 |
实例分配 | 通常是在线程上分配的(静态分配),但是在某些情况下可以存储在堆中 | 总是在进程中分配 |