C#中Ref和Out

问题:现在需要通过一个方法交换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呢?重点重点重点:

ref可以把参数的值传入函数,但无法通过out把一个数值传入方法中。体会理解这句话非常重要。当我们对于传进来的值有依赖的时候应该使用ref。而无法通过通过Out把一个参数传入方法中,也就是Out所在的方法对于传进来的值没有依赖性。

Ps:编辑器不允许通过Ref和Out进行重载,说明Ref和Out仅仅是在编辑器角度做了区分,生成的IL代码是一致的。

上一篇:unity编程实践 牧师与魔鬼


下一篇:原码,反码,补码之间的换算