C#语法——ref和out关键字的使用

前言

我们在C#开发中经常需要将一个参数传入一个方法,然后在方法内部改变这个参数的值,如果这个参数是引用类型,那么直接在方法中改变该参数的值,方法执行完以后该参数的值也会被改变;如果这个参数是值类型,那么在方法中改变该参数的值,方法执行完以后该参数的值是不会被改变的,ref 和out参数的作用就是将值类型的参数传入方法,并且在方法中改变该参数的值。

1、 ref 参数

ref关键字用于按引用传递参数。这意味着你传递的是参数的内存位置的引用,而不是参数的实际值。因此,在方法内部对参数的任何修改都会反映到原始变量上,所以ref关键字适用于本身这个值类型的变量就有初始化,然后我们还想让这个变量在原来的初始值的基础上在方法内部进行进一步的改变。

使用ref参数时,必须确保:

1)方法调用时传递的参数已经被初始化。

2)参数声明时,参数前面需要加上ref关键字。

3)方法调用时,传递的参数前面也需要加上ref关键字。

举例说明:

csharp 复制代码
 void RefTest(ref int x,  int y)
        {
            x = x + 10;
            y = y + 10;
        }
csharp 复制代码
   public Form1()
        {
            InitializeComponent();
            int x = 2;
            int y = 2;

            RefTest(ref x,y);
            Console.WriteLine(x);
            Console.WriteLine(y);

        }

输出结果:

csharp 复制代码
12
2

从上面的代码可以看出,x,y这两个变量都是值类型,但是使用ref 关键字以后,x的值在方法内部增加10以后,可以看到x最终的结果值发生了改变变成了12;但是y的值虽然在方法内部增加了10,但是实际上方法外部的y的值没有发生改变。

1、 out参数

out关键字也用于按引用传递参数,但是与ref参数不同,out参数不需要在方法外部被初始化,但是在方法内部必须要对out参数进行初始化,所以out参数适合在方法外不需要初始值的使用情况。

使用out参数时,必须确保:

1)参数声明时,参数前面需要加上out关键字。

2)方法调用时,传递的参数前面也需要加上out关键字(尽管这些参数在方法调用时不需要被初始化)。

3)方法内部必须为out参数赋值。

举例说明:

csharp 复制代码
  void outTest(out int x, int y)
        {
            x = 0;
            x = x + 10;
            y = y + 10;
        }
csharp 复制代码
  public Form1()
        {
            InitializeComponent();
            int x = 0;
            int y = 0;

            outTest(out x,y);
            Console.WriteLine(x);
            Console.WriteLine(y);

        }

输出:

csharp 复制代码
10
0

从上面的代码可以看出,x,y这两个变量都是值类型,但是使用out 关键字以后,x的值在方法内部增加10以后,可以看到x最终的结果值发生了改变变成了10;但是y的值虽然在方法内部增加了10,但是实际上方法外部的y的值没有发生改变。

相关推荐
qq_410194297 分钟前
.NET 8.0 下基于 PaddleOCRSharp 的离线文字识别落地指南
算法·.net
此时不提桶,更待何时8 分钟前
02-02-B-AQS与JUC锁面试与生产事故实战
java
音符犹如代码11 分钟前
Kafka 接入 AI 的三条路线:MCP 提案、会话记忆与实时上下文
java·大数据·ai·kafka
Omics Pro11 分钟前
1个月2轮融资!长寿虚拟细胞
数据库·人工智能·算法·机器学习·自然语言处理
residual_fan12 分钟前
航空发动机故障诊断专用智能体(六):实际机队健康管理中的应用考量与展望
人工智能·算法·数据挖掘·数据分析
vx_BS8133014 分钟前
【项目编号:project51629】Spring Boot 乡村自来水缴费系统:把抄表、水费生成与在线缴费做成一条数字化闭环
java·spring boot·eclipse·tomcat·maven
qq_2695067523 分钟前
第29课-Servlet基础
java
hansang_IR34 分钟前
【讲解】CSP-S2026 第一轮初赛
c++·算法
毅炼35 分钟前
不写多语言 SDK,怎么让 Python、Go、Node 服务接入注册中心?
java·后端·系统架构·gateway
hanlin0336 分钟前
刷题笔记:力扣第76题-最小覆盖子串
笔记·算法·leetcode