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的值没有发生改变。

相关推荐
kaikaile199510 小时前
基于 MATLAB 的室内三维定位
算法
AGI前沿11 小时前
AdamW的继任者?AdamHD让LLM训练提速15%,性能提升4.7%,显存再省30%
人工智能·算法·语言模型·aigc
Tan_Ying_Y11 小时前
什么是垃圾回收算法 他的底层原理是什么?
算法
7***374511 小时前
Java设计模式之工厂
java·开发语言·设计模式
Xの哲學11 小时前
Linux 分区表深度技术剖析
linux·网络·算法·架构·边缘计算
写写闲篇儿11 小时前
经典算法题剖析之传递信息(三)
算法
上不如老下不如小11 小时前
2025年第七届全国高校计算机能力挑战赛初赛 Python组 编程题汇总
开发语言·python·算法
程序员小白条11 小时前
你面试时吹过最大的牛是什么?
java·开发语言·数据库·阿里云·面试·职场和发展·毕设
折翅嘀皇虫11 小时前
fastdds.type_propagation 详解
java·服务器·前端