再识ref、out关键字

#前言
  提起ref和out关键字大家想必不陌生,之前看过C#视频应该都有印象,但是具体什么时候会用到这两个关键字,他们分别又起着什么样的作用真的是到了自己实践的时候才体会到这两个关键字带来的好处。

ref

这个关键字的实践是在自己写排序代码的时候。

        //方法--交换位置
        public void Swap(ref int a, ref int b)
        {
            int temp;
            temp = a;
            a = b;
            b = temp;
        }

        //冒泡排序
        public int[] bubbleSort(int[] arr)
        {
            for (int i = 0; i < arr.Length - 1; i++)   //外循环
            {
                for (int j = 0; j < arr.Length - 1 - i; j++)     //内循环
                {
                    if (arr[j] > arr[j + 1])             //每一个都和相邻的比
                    {
                        Swap(ref arr[j], ref arr[j + 1]);    //调用方法交换位置
                    }
                }
            }
            return arr;
        }

###demo解析:
  用不用ref有什么区别呢,区别就是用了ref,你就可以把调用swap方法后的结果呈现出来,如果不用ref,虽然调用了方法,方法体内也做了交互位置,但是还是呈现不出来你想要的结果,而这个是和void无关的。那怎么获取到交换位置的后结果呢,ref来帮忙了。
  当我们在调用swap方法的时候,加了ref关键字,这时候就必须给调用的方法参数赋值,就是arr[j]和arr[j+1],但是我们前面已经赋过值了,所以这里不用担心,接下来就是走swap方法体了,走进去的时候swap会对我们传进了的两个值进行交换,交换完就给我们传出来了。然后我们冒泡排序里面的交换位置效果就呈现出来了。这里为什么不用out呢? 大家想一想……
###ref关键字的理解:
  首先,当方法加了ref关键字后,就可以有多个返回值了。而且是多个类型,这取决与你在参数部分写了多少个参数,定义了什么类型。用ref关键字的时候你必须在调用方法的时候就给人家传值,然后走方法体人家又返回值给你,所以说ref是双向的。这里大家可以理解为:有进,有出,是双向的。

##out
这个关键字是在番茄钟项目中进行的实践

  //获取计划名称和计划ID方法
    public void getImplmentPlan(out string Implementplan, out string Implementid)
        {
            if (noImpNoUrgBox.Enabled == true)
            {
                string strplan = noImpNoUrgBox.SelectedItem.ToString();
                //用substring()截取所需字符串
                Implementplan = strplan.Substring(0, strplan.IndexOf(' '));
                Implementid = strplan.Substring(strplan.Length - 36, 36);
            }
            else
            {
			        MessageBox.Show("请选中计划");
                     Implementplan = null;
                     Implementid = null;
			}
		}
	
	//调用方法
	    getImplmentPlan(out Implementplan , out Implementid );			

###demo解析:
  我在参数部分写进了两个string类型的参数, Implementplan和Implementid,所以在方法体内就必须给他们赋值,因为他们要被out出来嘛,而且调用的时候要写上这两个参数和out关键字。但是调用getimplmentPlan方法的时候自己是不用给他们赋值的,就算是赋了值在调用的方法体里面也会被清空重新赋值,所以out只有“出”,没有“进”,是单向的。
###对out的理解:
  out关键字在这个地方的使用主要体现在了有多个返回值上,“out”从字面上看就是出来的意思,这样就比较容易理解了,out主要是负责把值从方法里面返回出来的,所以方法一定要有返回值。用out关键字后可以有多个返回值,而且可以是不同的返回类型,虽然前面写的返回类型时void,但是只要咱们在方法的参数里面写进了out关键字和返回类型int/string/arr[i]等等,然后再方法体给参数赋值就可以在调用方法时候拿到相应的多个返回值。

##ref和out的区别与联系:
###联系:
他们俩都是可以返回多值的,而且是不同的返回类型哦,只要你在参数里提前给人家定义好了就行~
###区别:

  1. ref是双向的,有进有出,在调用方法(进)的时候就必须给人家赋值,然后人家走方法体,给你返回值(出)。
  2. out是单向的,只有出,在调用方法(进)的时候不用给人家赋值,赋了值也没用,因为方法体内会重新赋值(必须的哦),你要是给人家赋值人家还是会给你清空了重新赋的,赋完了给你返回值(出)。

总结:

联系和区别都写得很清楚了,看到这是不是理解了第一个demo为什么用ref不用out呢,哈哈,不知道你理解了没,反正我是理解了。。嗯哼,哪里不理解可以跟杨老师沟通哈哈…… 比❤~

评论 85
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值