从毕业到现在不知不觉已经有一年多的时间了,从一个什么都不懂的职场新人到现在的半个办公室老油条,发现自己写代码的比以前顺畅了,但是好多以前没搞懂的知识点还是很模糊。最近重新捡起大学买的书籍来读,发现有了新的认识很收获,后面都会用博客的形式写下来。
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可以在函数内部改变值类型变量的原因。