C#关键字out与ref的区别
问题:为什么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;
}
运行结果显示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;
}
使用ref、out注意什么?
先看以下代码:
代码编译后,报错如下:
从编译的角度看,使用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代码是一样的。
上一篇: html5手机端遮罩弹出菜单代码
下一篇: JS(三)之DOM编程