Unity3D学习笔记-ref和out关键字区别

这几天遇到了一个奇怪的bug,找了好久问题发现了原来是对ref和out两个关键字理解有问题产生的。

ref:

1
2
3
4
5
6
7
8
9
10
11
12
static void Main(string[] args)
{
int a = 1;
int b = 2;//a和b必须都赋值。
Add(ref a, ref b);
Console.WriteLine("a:{0},b:{1}", a, b);
}
static void Add(ref int a, ref int b)
{
a += b;
b = 0;
}

out:

1
2
3
4
5
6
7
8
9
10
11
12
static void Main(string[] args)
{
int a;//a可以不赋值。
int b = 2;
Add(out a, out b);
Console.WriteLine("a:{0},b:{1}", a, b);
}
static void Add(out int a, out int b)
{
a = 1 + 2;
b = 0;
}

区别:

1.ref会把参数和引用都传入到方法之中,并且引用不能为空,所以在ref的程序里为a和b都赋值,如果没有赋值会报错。

2.out只会把引用传入到方法之中,并不会传入参数,所以其实out程序里可以不对a赋值,哪怕赋值也不会被传入。在out程序的Add方法中,a只能被赋值1+2,如果赋值a +b会报错,因为这时候a和b的参数都是空,参数并没有传进来。

有人总结的口诀是:ref有进有出,out只出不进。

ref的主要应用范围是方法里需要修改引用内容的,而out的主要应用范围是可以间接解决需要多个返回值的情况。