【C# 教程系列第 4 篇】什么是 c# 中的 ref 参数?

这是【C# 教程系列第 4 篇】,如果觉得有用的话,欢迎关注专栏。

写这篇博客之前,本来想把标题写成 “ref参数与out参数的区别”,但想了想还是分开写吧,以免更混淆大家。

首先,来看一句比较绕嘴的话

变量作为参数传给方法,同时希望在方法执行完成后,对参数所做的修改能够反映到变量上

该怎么处理呢?

你们觉得绕口吗?觉得绕口也没关系,因为看完我下面的讲解,你再理解这句话就会容易很多了。

接着进入文章正题部分

第一步
首先,我在控制台上写一个方法,方法的功能就是交换传入的数值,代码如下

    static void TestRef(int a,int b)
    {
        int temp;
        temp = b;
        b = a;
        a = temp;
    }

第二步
然后在 Main 函数里声明两个 int 类型的变量 x,y,然后调用 TestRef 方法。为做直观的对比,这里我把交换 x,y 前和交换 x,y后都在控制台上打印出来,代码如下

    static void Main(string[] args)
    {
        int x = 10;
        int y = 20;
        Console.WriteLine("交换之前,x={0},y={1}",x,y);
        TestRef(x,y);
        Console.WriteLine("交换之后,x={0},y={1}",x,y);
        Console.ReadKey();
    }

按 F5 启动项目,如下
在这里插入图片描述
我们明明调用了可以交换传入数值位置的函数 TestRef,为什么却没有交换 x 和 y 的位置呢?

原因分析
首先,函数本身没有问题,问题在于 int 是值类型,它所创建的实例不在托管堆中分配内存,而是直接存储在变量中。虽然我们调用了函数 TestRef,但也不过只是复制了一遍 x,y 的值而已。那我们想在调用完交换函数 TestRef 后,x,y的位置可以交换,该怎么做呢?

这就要引入关键字 ref

什么是 ref
ref (全拼:reference):强制要求参数按引用传值。

使用 ref 关键字 有两个注意事项,如下

  • 一:传入参数之前,必须给参数赋值。
  • 二:调用方法时,必须加 ref 关键字。

验证注意事项一:

现在假如我们不给 x 赋初始值,会有什么问题呢?
在这里插入图片描述
验证注意事项二:

我们在函数 TestRef 里参数类型前面加上 ref 关键字

    static void TestRef(ref int a,ref int b)
    {
        int temp;
        temp = b;
        b = a;
        a = temp;
    }

然后直接调用这个函数会有什么问题呢?
在这里插入图片描述
以上两个验证便是使用 ref 关键字需要注意的事项。

在调用函数里加上ref关键字后
在这里插入图片描述
我们再按F5,看有什么不一样的效果
在这里插入图片描述
OK。x,y交换位置成功。

现在再回头看那句绕嘴的话,变量作为参数传给方法,同时希望在方法执行完成后,对参数所做的修改能够反映到变量上,现在应该容易理解了吧!

你的问题得到解决了吗?欢迎在评论区留言。

赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。


结束语

技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。

最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。
  • 96
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen Su

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值