• C#之ref 参数


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

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

    该怎么处理呢?

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

    接着进入文章正题部分

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

    static void TestRef(int x, int y)
    {
        int temp;
        temp = y;
        y = x;
        x = 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();
    }

    启动项目,结果如下

    我们明明调用了可以交换传入数值位置的函数 TestRef,为什么却没有交换 x 和 y 的位置呢?

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

    这就要引入关键字 ref

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

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

    一:传入参数之前,必须给参数赋值。
    二:调用方法时,必须加 ref 关键字。
    验证注意事项一:

    现在假如我们不给 x 赋初始值,会有什么问题呢?

    验证注意事项二:

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


    然后直接调用这个函数会有什么问题呢?

    以上两个验证便是使用 ref 关键字需要注意的事项。

    在调用函数里加上ref关键字后

    我们再按F5,看有什么不一样的效果

    OK。x,y交换位置成功。

    现在再回头看那句绕嘴的话,变量作为参数传给方法,同时希望在方法执行完成后,对参数所做的修改能够反映到变量上,现在应该容易理解了吧!
    ————————————————
    版权声明:本文为CSDN博主「Allen Su」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_42351033/article/details/85121688

  • 相关阅读:
    java实现远程开机
    windows系统设备管理器显示全部硬件
    使用pl/sql在oracle中新建表和对应序列
    mysql,oracle,sql server中的默认事务隔离级别查看,更改
    没有外网情况下linux安装mysql
    解决IntelliJ IDEA 创建Maven项目速度慢问题 DarchetypeCatalog
    vmware中linux虚拟机使用NAT模式不能连接外网解决
    idea中新建的web项目不能新建servlet
    SSH开源框架的优缺点
    配置JDK环境变量,与各步骤的意义
  • 原文地址:https://www.cnblogs.com/heike470/p/12490354.html
Copyright © 2020-2023  润新知