函数的普通调用,会将函数加载到栈空间中,传递的值是直接拷贝传递也就是“值传递”的,函数中形参的值不会返回到实参上。

在形参和实参前面都加入ref/out参数,调用函数,会将函数加载到栈空间中,传递的就是一个地址,也就是“引用传递”,函数中形参的值返回到实参上。

ref参数

在形参和实参前面都加入ref参数时,函数外必须要为变量赋值,而函数内可以不赋值。

eg:

int num_1 = 5;
double dou_1 = 5;
Add1(ref num_1,ref dou_1);
print(num_1 + " " + dou_1);//15 25

void Add1(ref int num,ref double dou)
{
    dou += 20;
    num += 10;
}

out参数

在形参和实参加入out关键字时,函数外可以不为变量赋值,但是函数内必须为其赋值。

eg:

int num_1 = 5;
double dou_1 = 5;
Add(num_1,dou_1,out num_1,out dou_1);
print(num_1 + " " + dou_1);//15 25

void Add(int num1,double dou1,out int num,out double dou)
{
    dou = dou1;
    num = num1;
    dou += 20;
    num += 10;
}

相同点和不同点

相同点:

  • ref和out都可以让形参进行引用传递,使用参数后将会改变原来的数值,即引用传递,这样就解决了返回多个值的问题

不同点:

  • ref可以把参数的数值传递进函数,即写了ref关键字的参数必须要在方法外初始化
  • out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须在方法内初始化一次
  • 也就是说,ref是有进有出,out是只出不进