重新开始学习.NET之一–ref参数和out参数
从毕业到现在不知不觉已经有一年多的时间了,从一个什么都不懂的职场新人到现在的半个办公室老油条,发现自己写代码的比以前顺畅了,但是好多以前没搞懂的知识点还是很模糊。最近重新捡起大学买的书籍来读,发现有了新的认识很收获,后面都会用博客的形式写下来。
C#函数返回的值只有一个,想要返回多个值或者在调用函数时改变某个变量的值就可以用到ref和out参数,ref和out参数用法如下:
public static int ChangeParamsWithRef(int a, ref int b)
{
b = 2;
return a + b;
}
public static int ChangeParamsWithOut(int a, out int b)
{
b = 2;
return a + b;
}
我们可以声明一个变量b,再来分别调用这两个:
int a = 3;
int b;
int c = ChangeParamsWithRef(a, ref b);
int d = ChangeParamsWithOut(a, out b);
在调用ChangeParamsWithRef时编译器会报一个错误,告诉我们参数b未赋值。
从这里我们可以知道ref和out参数的第一个不同点:
ref传递参数进入函数,这个参数必须初始化,而out参数可以不用初始化
实际上即使我们在使用out传递参数之前初始化了需要传递的变量,该变量还是会在函数中再次初始化一次。
现在,我们将两个函数的return语句放在b参数的赋值之前,即ref和out传递进来的参数没有发生任何改变就结束了这个函数:
public static int ChangeParamsWithRef(int a, ref int b)
{
return a + b;
b = 2;
}
public static int ChangeParamsWithOut(int a, out int b)
{
return a + b;
b = 2;
}
这时编译器会报一个错误,告诉我们在执行return语句之前必须要对out参数赋值,并且在ChangeParamsWithOut中的return语句会报一个使用了未赋值的参数b的错误
通过上面的这个例子我们知道了ref和out参数的另外一个不同点:
out参数在函数结束之前必须对其赋值,且out参数在进入函数后会被重新初始化
ref和out参数有一个共同点:
使用ref或out进行传递参数,都是传递的该参数的引用
也就是说,参数不管是结构还是自定义类,不管是Int类型还是String类型,使用了ref和out关键字最后传递的都是它的引用,这也是为什么使用ref和out可以在函数内部改变值类型变量的原因。