在 C# 中,有三种向方法传递参数的方式。
1.值参数:调用方法时,会为每个值参数创建一个新的存储位置,复制参数的实际值给函数的形参。
按值传递--传递实参变量存储的内容
作用:传递信息
2.引用参数:引用参数是一个对变量的内存位置的引用,复制参数的内存位置的引用给形参。
按引用传递--传递实参变量自身的内存地址
作用:改变数据
3.输出参数:可以返回多个值。
按引用传递--传递实参变量自身的内存地址
作用:返回结果
输出参数与引用参数的区别
ref 传入的变量必须初始化,但是在内部 可改可不改 (有进有出)
out 传入的变量不用初始化,但是在内部 必须修改该值 (只出不进)
区别1:输出参数 传递之前不需要赋值
区别2:方法内部必须为输出参数赋值
ref 的使用
//不使用 ref;
void Method(int myRefInt)
{
myRefInt += 66;
}
int number = 1;
Method(number);
(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);
(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;
}
(number);
//输出:0
int number;
Method(out number);
void Method(out int myRefInt)
{
myRefInt = 66;
}
(number);
//输出:66
总结
值参数:传递信息 表示实参和形参使用的是两个不同内存中的值。所以形参值改变,不会影响实参的值。
引用参数:改变数据 表示与提供给方法的实际参数具有相同的内存位置。
输出参数:返回结果 会把方法输出的数据赋给自己,其他方面与引用参数相似。