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代码是一致的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值