让我们先来看一段代码:
void Method(int t)
{
t += 44;
}
int num = 20;
Method(num);
Console.Write(num); //输出20
可以发现,修改Method方法中形参t的值,并不会改变num值。下图可以清楚地描绘出上述代码执行的整个过程:
执行Method方法前,栈中存放着一个int型变量num:
执行Method方法后,系统将实参num的值复制给形参t,栈中会为形参t分配好空间:
此时修改形参t的值(t += 44):
Method方法结束,形参从栈中弹出:
综上,num值并未被修改。
那么若要修改num值,要怎么办呢?其中有一个方法就是定义ref参数。
ref是一种引用参数,它让形参成为实参的别名(具体什么意思呢?稍后会说到),指示参数按引用传递,而非按值传递。换而言之,相当于对形参执行的任何操作都是对实参执行的。使用ref时,应注意:
- 必须在方法的声明和调用中都使用ref修饰符
- 实参必须是变量,在用作实参之前必须被赋值。如果是引用类型变量,可以赋值为一个引用或null。
使用ref参数修改完后的代码如下:
void Method(ref int t) //改动的地方
{
t += 44;
}
int num = 20;
Method(ref num); //改动的地方
Console.Write(num); //输出64
下面来看下上述代码在系统中的运行过程:
执行Method方法前,栈中存放着一个int型变量num:
接下来,执行Method方法。由于声明了ref修饰符在前,此时,形参名成为了实参的别名,因此实参num和形参t引用了相同的内存位置:
此时修改形参t的值(t += 44):
方法结束后,num的值被改变。
简言之:ref参数能够将一个变量带入方法中进行改变,改变完成后,可以再将改变的值带出方法。


