欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C#关键字out与ref的区别

程序员文章站 2022-05-06 09:30:13
...

问题:为什么C#中要有ref和out?

先看下面一段代码:想通过Exchange方法交换A、B两个变量的值,交换前A=10,B=20.

static void Main(string[] args)
{
    int A = 10;
    int B = 20;
    Exchange(A,B);
    Console.WriteLine($"交换后,A为{A},B为{B}");
}
//交换A、B的值
private static void Exchange(int A, int B)
{
    int temp = A;
    A = B;
    B = temp;
}

C#关键字out与ref的区别

运行结果显示A、B的值并未交换,原因是因为值类型的A、B传递的是栈中数据的拷贝,而非A、B本身在栈中的地址(引用)。

解决方案:因此,C#中提出了ref 和out两个关键字。

利用ref修改代码如下即可实现A和B的交换:

static void Main(string[] args)
{
    int A = 10;
    int B = 20;
    Exchange(ref A,ref B);
    Console.WriteLine($"交换后,A为{A},B为{B}");
}
//交换A、B的值
private static void Exchange(ref int A,ref int B)
{
    int temp = A;
    A = B;
    B = temp;
}

C#关键字out与ref的区别

使用ref、out注意什么?

先看以下代码:

C#关键字out与ref的区别

代码编译后,报错如下:

C#关键字out与ref的区别

从编译的角度看,使用ref时,必须在方法调用之前要初始化。而使用out时,必须在方法里面进行初始化。

ref(C# 参考)

MSDN的定义:The ref keyword indicates a value that is passed by reference。表示ref是通过引用来传递参数。ref也是Reference的缩写。

其效果是,当变量传递到方法时,在方法中对参数的任何更改都将反映在该变量中。如果要使用 ref 参数,则在定义的方法以及调用该方法时都必须使用 ref 关键字来修饰参数。

注意:传递给ref的参数,在调用方法前必须先初始化在被调用函数内,ref引入的参数在返回前不必为其赋初值。

 

out(C# 参考)

MSDN的定义:The out keyword causes arguments to be passed by reference。表示out作为一个参数修饰符,允许你通过引用而不是通过值将参数传递给方法。

out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。如果要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字来修饰参数。

注意:尽管作为 out 参数传递的变量不必在传递之前进行初始化,但需要在被调用函数内,out引入的参数在返回前至少赋值一次。

 

关于重载:有out|ref关键字的方法可以与无out和ref关键字的方法构成重载;但如想在out和ref间重载,编译器将提示:不能定义仅在ref和out的上的方法重载。充分说明out和ref的区别仅是编译器角度的,他们生成的IL代码是一样的。