面试遇到了一个题目叫做ref和out的区别是啥?
平时经常使用out,偶尔也会使用ref,但是从来没有仔细分析过他俩有啥区别?
1.传递给ref关键字的参数必须赋初始值,而out不用。
2.out关键字会清空变量,退出函数时所有out引用个变量都要赋值。
该如何理解这句话呢?
********************************************************************************************************
static void Main(string[] args)
{
int count =0;//
ChangeOut(out count);
Console.WriteLine(count);//输出值是105
Console.ReadKey();
}
public static int ChangeOut(out int counts)//这里会清空counts的值
{
counts = 100;//这时候counts相当于没有值传递进来,在return之前要对counts赋值
counts = counts + 5;
return 1;
}
********************************************************************************************************
static void Main(string[] args)
{
int count = 100;//
ChangeRef(ref count);
Console.WriteLine(count);//输出值为105
ChangeRef(ref count);
Console.WriteLine(count);//由于count的值被ChangeRef方法修改,这时候count输出值为110
}
public static void ChangeRef(ref int counts)
{
counts = counts + 5;
}
********************************************************************************************************
从以上两个例子可以看到,out在主函数赋值之后,值不会传入到方法中,需要在方法体中从新赋值,然后会把方法中最终值带出来。
ref在调用方法时,会把方法传入到方法体中,最终会直接改变主函数中的值。
仅仅从结果看,二者看不出直接区别,只是实现原理不同。
PS:out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候