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

相关推荐
咖啡八杯1 分钟前
GoF设计模式——装饰模式
java·算法·设计模式·装饰器模式
_Aaron___2 分钟前
RAG 知识库越用越脏?先把“增量更新”设计清楚
java·人工智能
装不满的克莱因瓶3 分钟前
实现矩阵的点积:从数学原理到 NumPy 实战
人工智能·线性代数·算法·机器学习·矩阵·numpy
HZ·湘怡3 分钟前
树 的定义 与 性质
算法·
梦想的颜色3 分钟前
Docker 入门指南:从零开始掌握容器化技术
运维·服务器·vscode·python·算法·docker·云原生
飞翔中文网4 分钟前
Java学习笔记之注解
java·笔记·学习
雪豹阿伟5 分钟前
14.C# —— 静态成员、只读常量、继承、访问修饰符、多态、抽象类
c#·上位机
cpp_25016 分钟前
P10109 [GESP202312 六级] 工作沟通
数据结构·c++·算法·题解·洛谷·gesp六级
BossFriday6 分钟前
【手撸IM】SycllaDB 消息存储基础
java·分布式·中间件
吴可可1236 分钟前
CAD二次开发中多段线定点分割技巧
算法