- 值类型和引用类型的区别
值类型的变量直接存储数据分配在托管栈中,变量在创建他们的方法返回时自动释放,例如在一个方法中声明char型的变量name="c",当实例化他的方法结束时,name变量在栈上占用的内存会自动释放。
- 值类型(value type)
- 数值类型(integer short long byte char)
- 结构体(包括自定义的)
- bool型
- 枚举 enum
- 可空类型 (派生自system.nullable<T> 泛型结构体)
- 引用类型的变量持有的是数据的引用,数据存储在数据堆,分配在托管堆中,变量并不会在创建他们的方法结束时释放内存,他们所占用的内存会被CLR的垃圾回收机制释放
- 引用类型
- 数组(array)
- 类
- 接口(interface)
- 委托(delegate)
- Object
- 字符串 (string)
- null类型
- 引用类型
| 值类型 | 引用类型 |
存储方式 | 直接存储数据本身 | 存储数据的引用 |
内存分配 | 分配在栈中 | 分配在栈中 |
效率 | 效率高,不需要地址转换 | 效率低,需要地址转换 |
内存回收 | 使用完立即回收 | 使用完不立即回收,交给GC 处理回收 |
赋值操作 | 创建一个新对象 | 创建一个引用 |
类型扩展 | 不易扩展 | 具有多态的特性,容易扩展 |
实例分配 | 通常在线程栈上分配的(静态分配),某些情况下可以存储在堆中 | 总是在京城堆中分配(动态分配) |
拆箱和装箱
- 装箱就是将一个值类型转换成等值的引用类型
- 在堆上为新生成的对象(该对象包含数据,对象本身没有名称)分配内存
- 将栈上值类型变量的值拷贝到堆上的对象中
- 将堆上创建的对象地址返回给引用类型变量
- 拆箱就是将一个引用类型转换成等值的值类型
- 将引用类型变量堆上的值拷贝到站上面
值传递仅仅传递的是值,不影响原始值
引用传递, 传递的是地址,修改后会改变内存的地址