C# 按值传递与按引用传递的区别 - chunlieater/chunlifeet GitHub Wiki

C# 按值传递与按引用传递的区别

  • 值类型和引用类型:值类型的存储空间都在栈里,引用类型的地址在栈里,存储空间在堆里。
  • 一、引言   C#中参数的传递方式可以分为两类,按值传递和按引用传递。如果再根据参数的类型进行细分,大致可以分为如下四种:

值类型的按值传递 按值传递时,传递过去的是该值类型实例的一个拷贝。

引用类型的按值传递 按值传递时,传递过去的是该引用类型实例的引用的一个拷贝,这样说可能不是很清楚,而且容易引起误解。所谓引用,就是分配在栈上的一小块内存区域,里面存放着该引用类型实例在托管堆上的地址。引用类型在按值传递的时候,其实就是把它的引用在栈上复制出来一份,然后传递给方法。这样就造成了栈上的两个引用指向了托管堆上的同一个实例,传递的是引用类型的地址的拷贝,将传递后的引用赋值给其他变量,不影响被传递的引用变量。

值类型的按引用传递 按引用传递的时候是不存在拷贝这步操作的,众所周知,值类型的实例是分配在栈上的,所以在按引用传递值类型的时候,其实是把该实例在栈上的地址,传递给了方法,传递的就是值本身。

引用类型的按引用传递 引用类型的按引用传递过程,与值类型的相似,也不存在拷贝这步操作,只是将“该实例的引用”在栈上的地址,传递给了方法,传递的就是引用类型本身。

对照C++的 按值传递,按地址传递,按引用传递 可以看出 C#的按值传递值类型,和C++按值传递一样。 C#的按值传递引用类型,和C++的按地址传递一样。 C#的按引用传递,和C++的按引用传递一样。