值类型和引用类型的区别

1、管理机制:

主要指对内存空间进行分配和释放

值类型(栈):作用域结束时被操作系统自行释放

(值类型的变量直接存储数据,分配在托管栈中。变量会在创建它们的方法返回时自动释放,例如在一个方法中声明Char型的变量name=’C’,当实例化它的方法结束时,name变量在栈上占用的内存就会自动释放)
引用类型(堆):垃圾回收器(GC)负责

(引用类型的变量持有的是数据的引用,数据存储在数据堆,分配在托管堆中,变量并不会在创建它们的方法结束时释放内存,它们所占用的内存会被CLR中的垃圾回收机制释放。)

2、内存分配:

值类型:值类型实例总会分配到变量被申明的地方

  • 申明的是局部变量,将被分配到栈上
  • 申明为引用类型成员时,则被分配到管理堆上

引用类型:

  • 实例总是分配到托管堆上
  • 变量存储在栈中。引用类型的变量存放的则是数据的地址,即对象的引用。

3、赋值方式:

值类型:复制变量包含的值
引用类型:复制对象引用,即对象的地址

 堆一般用于存储可变长度的数据,而堆栈则用于存储固定长度的数据

装箱和拆箱

1)装箱就是将一个值类型转换成等值的引用类型

在堆上为新生成的对象(该对象包含数据,对象本身没有名称)分配内存。

将堆栈上值类型变量的值拷贝到堆上的对象中。

将堆上创建的对象的地址返回给引用类型变量(从程序员角度看,这个变量的名称就好像堆上对象的名称一样)。

2)拆箱就是将一个引用类型转换成等值的值类型

将引用类型变量堆上的值拷贝到栈上面。

4、基类:

值类型:继承自System.ValueType;System.ValueType又继承自System.Object
引用类型:引用类型继承自System.Object

值类型包括:数值类型,结构体,bool型,用户定义的结构体,枚举,可空类型。

引用类型包括:数组,用户定义的类、接口、委托,object,字符串,null类型,类。

总结

值类型和引用类型理解透彻后,我们知道C#里面是值传递,但是有些变量是引用类型的,在传递和拷贝时需要特别注意。方法传递参数时加上ref(out),为引用传递参数。

值传递仅仅传递的是值,不影响原始值。

引用传递,传递的是内存地址,修改后会改变内存地址对应储存的值。



原文地址:https://www.cnblogs.com/QueryWord/p/14133911.html