0%

C#中的ref和out


终于可以开始写有关C#的内容了,这次先记录下C#中的两个关键字ref out的使用。
在C#7.0以后,可以用更加方便的元组代替二者。


ref

我们可以考虑这样一种情况。
在某次项目中,我们需要实现一个Swap(int a, int b)方法,用来交换两个整形变量的值。很显然,该方法必须有如下一种实现:

  1. 一次返回两个值。
  2. 直接修改两个变量。

而我们知道,一般情况下,一个方法只能返回一个值。这种情况下,就需要用到ref了。
使用ref可以实现第二种方法,它会传递变量的引用给方法。
可以写出如下代码:

1
2
3
4
5
6
static void Swap(ref int a, ref int b)
{
int c = a;
a = b;
b = c;
}

Main函数中调用:

1
2
3
4
5
6
7
8
9
static void Main(string[] args)
{
int a = 4;
int b = 3;

Console.WriteLine($"a = {a}, b = {b}");
Swap(ref a, ref b);
Console.WriteLine($"a = {a}, b = {b}");
}

输出:

1
2
a = 4, b = 3
a = 3, b = 4

在调用方法时,实参也要带ref关键字,且所传递的变量必须初始化。

out

在上文中,我们提及了两种实现交换的方法,而out可以实现第一种方法。
可以改写Swap函数为:

1
2
3
4
5
6
static int Swap(int a, int b, out int c)
{
c = a;
a = b;
return a;
}

改写Main函数为:

1
2
3
4
5
6
7
8
9
10
static void Main(string[] args)
{
int a = 4;
int b = 3;

Console.WriteLine($"a = {a}, b = {b}");
a = Swap(a, b, out int c);
b = c;
Console.WriteLine($"a = {a}, b = {b}");
}

其输出结果和使用ref输出相同。
在调用方法时,实参也要带out关键字,且所传递的变量必须在方法内初始化。

在C#7.0以后可以在参数列表中声明out变量。7.0前必须在调用方法前先声明所需变量。

代替

在C#7.0以后,可以用元组代替上述两个关键字。元组不仅更加便于理解,而且可读性比之后两者有了显著性的提高。
在需要返回多个值时,推荐优先考虑元组的实现。


-------------End-------------