引用类型传参的时候传递的是对象的引用,引用变量是存在线程栈上的,变量的值是 GC堆里的对象的地址
所以引用变量加ref传参的时候,传递的不是GC堆上变量的地址(也就是引用变量的值),而是引用变量的地址(也就是变量在线程栈上的地址)
例子:
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Test test = new Test();
test.Name="Begin";
Trans(test);
Console.WriteLine(test.Name);
}
public static void Trans(Test test)
{
Test t = new Test();
t.Name = "End";
test = t;
}
}
public class Test
{
public string Name = "Hello";
}
}
未用ref传参,输出结果是Begin,不提。
若使用ref传参,输出结果是End,使用ref传参的时候 传递的是test变量在线程栈上的地址,而不是test的值(GC堆上变量的地址),在Trans方法里面new了一个新Test对象,把对象在GC对上的地址 存到引用变量t里面。test=t,让test指向t所指向的新对象(这个对象的Name=“End”),方法调用完毕,回到主函数,这时test所指向的对象已经不是以前的对象了,而是在方法Trans里面new的对象。
如果没有用ref或out关键字的话,在给方法传递参数时,会有一个复制的过程,传递的是拷贝而不是数据本身,不管是值类型还是引用类型。
当然,用上了ref的话,就没有了这个复制过程,Main方法中的引用变量和方法中的引用变量就是实实在在的同一个引用了。