在 C# 中,有三种向方法传递参数的方式。

1.值参数:调用方法时,会为每个值参数创建一个新的存储位置,复制参数的实际值给函数的形参。

                按值传递--传递实参变量存储的内容

作用:传递信息

2.引用参数:引用参数是一个对变量的内存位置的引用,复制参数的内存位置的引用给形参。

                按引用传递--传递实参变量自身的内存地址

作用:改变数据

3.输出参数:可以返回多个值。

                按引用传递--传递实参变量自身的内存地址

作用:返回结果

输出参数与引用参数的区别

 ref 传入的变量必须初始化,但是在内部 可改可不改      (有进有出)
out 传入的变量不用初始化,但是在内部 必须修改该值  (只出不进)

区别1:输出参数 传递之前不需要赋值

区别2:方法内部必须为输出参数赋值

ref 的使用

//不使用 ref;
void Method(int myRefInt)
{
    myRefInt += 66;
}

int number = 1;
Method(number);
Console.WriteLine(number);
**//输出 : 1;**

原因是C#中方法的参数传递默认是值传递(value pass)。在Method方法中,myRefInt是number的值的一份拷贝,也就是1。在方法内部修改myRefInt的值,不会影响到传入的原始变量number。所以Method方法内部的:


myRefInt += 66;


只是修改了myRefInt这个局部拷贝,number仍然为初始值1。如果想要方法内部的修改反映到外部,可以使用引用传递(reference pass):


void Method(ref int myRefInt) { myRefInt += 66; } int number = 1; Method(ref number);


加上ref关键字,传递的是number的引用,这样方法内对引用的修改就会改变number本身。或者可以直接返回更新后的值:


int Method(int myInt) { return myInt + 66; } int number = 1; number = Method(number);


这种情况下number会被更新为返回的值。所以结论是,C#默认值传递,如果想修改外部变量需要使用引用传递或返回更新后的值。

 

//使用ref
void Method(ref int myRefInt)
{
    myRefInt += 66;
}

int number = 1;
Method(ref number);
Console.WriteLine(number);

**//输出:67**

看到这里想必已经明白了:

  • 不使用ref的时候,函数收到的值是1,然后在Method(int myRefInt)方法中,局部变量myRefInt做了累加之后,在方法执行完成之后就已经销毁了。number的值还是1。
  • 使用ref的时候,函数Method(ref int myRefInt)值收到的是number的地址,函数中执行的myRefInt+=66;此时相当于number+=66;直接修改了number地址的值。
    那就可以等处结论了:ref是通过给方法传递值类型的参数,直接操作同一个变量的关键字。

out的用法

int number;

Method(number);

void Method(int myRefInt)
{
    myRefInt = 66;
}

Console.WriteLine(number);
//输出:0
int number;

Method(out number);

void Method(out int myRefInt)
{
    myRefInt = 66;
}

Console.WriteLine(number);
//输出:66

总结

值参数:传递信息 表示实参和形参使用的是两个不同内存中的值。所以形参值改变,不会影响实参的值。

引用参数:改变数据 表示与提供给方法的实际参数具有相同的内存位置。

输出参数:返回结果 会把方法输出的数据赋给自己,其他方面与引用参数相似。