C# 中的数值传递分为两种,一种是值传递,一种是引用传递。
值传递
在调用有参函数的时候,对于一些简单类型的传递是赋值形式的传递(例如: int, float 等)这些在传递的时候,就是值传递。
引用传递
在传递函数的时候,不是赋值,而是将参数的地址传递过去。(例如: string, object 等)这些都是引用传递。
那么就出现了一个问题,因为值传递中, 实参将值传递给形参,无论在函数里对行参如何操作,都不会影响实参, 而有时候我们却想在函数里改变实参的数值。例如:
class Program
{
static void Add(int a, int b)
{
a = a + b;
}
static void Main(string[] args)
{
int a = 10;
int b = 20;
Console.WriteLine("a = {0}, b = {1}", a, b);
Add(a, b);
Console.WriteLine("a = {0}, b = {1}", a, b);
Console.ReadKey();
}
}
如上面的代码,输出的结果:
a = 10, b = 20
a = 10, b = 20
那我如果想要 调用 Add 函数后,改变 a 的值怎么办呢?
这个时候,就需要用到 ref 关键字了
ref
ref 的作用就是 可以改变传递参数的值,传递的是实参的地址。
ref 有两个限制:
- 因为可以改变其传递的值,所以实参必须是非常量的变量
- 实参必须初始化
使用方法:
class Program
{
static void Add(ref int a, int b)
{
a = a + b;
}
static void Main(string[] args)
{
int a = 10;
int b = 20;
Console.WriteLine("a = {0}, b = {1}", a, b);
Add(ref a, b);
Console.WriteLine("a = {0}, b = {1}", a, b);
Console.ReadKey();
}
}
这样输出的结果就是
a = 10, b = 20
a = 30, b = 20
out
说到 ref 就会想到另一个关键字 out
当 你想给指定的参数一个输出值时,这个时候就会用到 out ,它的用法跟 ref类似。
只是限制不一样
- 给定的参数不需要初始化(如果初始化赋值了,最后在函数调用的时候,也会重新赋值)
- 传递的函数必对 out 修饰的变量赋值
代码如下:
class Program
{
static void Add(int a, out int b)
{
b = a;
}
static void Main(string[] args)
{
int a = 10;
int b = 20;
Console.WriteLine("a = {0}, b = {1}", a, b);
Add(a, out b);
Console.WriteLine("a = {0}, b = {1}", a, b);
Console.ReadKey();
}
}
输出的结果:
a = 10, b = 20
a = 10, b = 10