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

相关推荐
Mr_Xuhhh37 分钟前
项目需求分析(2)
c++·算法·leetcode·log4j
c++bug1 小时前
六级第一关——下楼梯
算法
BillKu1 小时前
推荐 Eclipse Temurin 的 OpenJDK
java·ide·eclipse
Morri31 小时前
[Java恶补day53] 45. 跳跃游戏Ⅱ
java·算法·leetcode
悟能不能悟1 小时前
eclipse怎么把项目设为web
java·eclipse
乂爻yiyao1 小时前
java 代理模式实现
java·开发语言·代理模式
林木辛2 小时前
LeetCode热题 15.三数之和(双指针)
算法·leetcode·双指针
AndrewHZ2 小时前
【3D算法技术】blender中,在曲面上如何进行贴图?
算法·3d·blender·贴图·三维建模·三维重建·pcg
2301_770373732 小时前
Java集合
java·开发语言
Jared_devin2 小时前
二叉树算法题—— [蓝桥杯 2019 省 AB] 完全二叉树的权值
数据结构·c++·算法·职场和发展·蓝桥杯