问题:现在需要通过一个方法交换a,b两个变量的值,应该如何做?
我是如下做法:
int a = 1;
int b = 2;
public void ChangeNumber(int a, int b)
{
int t = a;
a = b;
b = t;
Debug.LogFormat("方法内a=>{0}", a);
Debug.LogFormat("方法内b=>{0}", b);
}
private void Start()
{
ChangeNumber(a, b);
Debug.LogFormat("方法外a=>{0}", a);
Debug.LogFormat("方法外b=>{0}", b);
}
发现并不能交换a和b的值;解析如下:int 为值类型它存储在线程的栈中调用ChangeNumber时候相当于拷贝了一份a和b的值。在ChangeNumber方法中交换值仅仅是在改变拷贝的值,和原来的ab没有任何关系。原来的a还是原来的a b还是原来的b.这就是C#中按值传递的原理。传递的是变量对应数据的一个拷贝,而不是本身。
所以这个时候C#就为我们提供了这样的解决方案:ref和out可以让值类型按引用进行传递
public void ChangeNumber(ref int a,ref int b)
{
int t = a;
a = b;
b = t;
Debug.LogFormat("方法内a=>{0}", a);
Debug.LogFormat("方法内b=>{0}", b);
}
private void Start()
{
ChangeNumber(a, b);
ChangeNumber(a, ref b);
Debug.LogFormat("方法外a=>{0}", a);
Debug.LogFormat("方法外b=>{0}", b);
}
问题:现在需要一个方法,通过计算返回平均值和和?按照传统的普通方法只能有一个返回值,而Out让它成为了可能。当然了Ref也可以做到。区别后面另说。
public void GetResult(out int num,out int ave)
{
num = a + b;
ave = num / 2;
}
private void Start()
{
//尽管作为 out 参数传递的变量不必在传递之前进行初始化,但需要在调用方法前先声明。
GetResult(out int num, out int ave);
Debug.LogError("num==>" + num);
Debug.LogError("ave==>" + ave);
}
总结:ref在使用前必须进行初始化,out 参数传递的变量不必在传递之前进行初始化,但是需要在调用方法前声明。Ref又进又出,Out出不进。那么在什么情况下使用Ref和Out呢?重点重点重点: