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

相关推荐
whatever who cares2 分钟前
android/java中gson的用法
android·java·开发语言
摇滚侠5 分钟前
Spring Boot3零基础教程,为什么有Reactive-Stream 规范,响应式编程,笔记101
java·spring boot·笔记
一个不知名程序员www8 分钟前
算法学习入门---二分查找(C++)
c++·算法
周杰伦fans14 分钟前
C# 中 Entity Framework (EF) 和 EF Core 里的 `AsNoTracking` 方法
开发语言·c#
天天摸鱼的java工程师19 分钟前
八年 Java 开发手敲:SpringBoot+SpringSecurity+JWT 实战,前后分离权限注解落地就能跑
java·后端
冰淇淋@21 分钟前
idea启动项目报错java: OutOfMemoryError: insufficient memory
java·ide·intellij-idea
techzhi23 分钟前
this view is read-only (IntelliJ IDEA)
java·ide·intellij-idea
编程学委25 分钟前
Idea(2023版)使用Svn
java·svn·intellij-idea
qianbailiulimeng25 分钟前
IDEA + Spring Boot 的三种热加载方案
java·后端
王元_SmallA26 分钟前
网卡驱动架构以及源码分析
java·后端