值类型和引用类型的一点真相
- 变量的值在它声明时的位置存储,实例变量的值总是存储在实例本身存储的地方
- 栈:局部变量(比如局部声明的值类型变量,比如指向引用类型实例的指针)
- 堆:引用类型实例、静态变量(引用类型实例里的值类型的值当然也在堆上)
- 值类型不能再派生,引用类型可以再派生
- 值类型不需要额外信息描述类型
- 引用类型的对象包含一个数据块标识实际类型
- 参数传递
- 引用传递:调用的方法可以通过更改其参数值,来改变调用者的变量值。定义很复杂,涉及左值。
- 引用类型作为方法参数使用时,默认以值传递的方式,但值本身是一个引用
- 装箱:堆上创建包含值的对象,是原始值的副本
- 拆箱:也会复制一遍箱内的值,可能抛出类型转换异常
参考:
C# in depth