在平时做开发时候,调用方法获得返回值都是只能获得一个返回值的,但是有时候我们需要获得多个,比如:我想要返回一个字符串,同时还想要一个List数组,但是一个方法只能有一个return,所以在这种情况官方就提供给我们新的方法实现我们想要的结果!
Ref 和 Out 两者比较
共同点:out
、ref
都是传递引用(内存地址),使用后都将改变原来参数的数值。
不同点:ref
是有进有出,out
是只出不进(就是把一个参数通过传入方法时候,会自动清空原先所有,变为一个干净的参数):ref
可以把参数的值传入函数,但无法通过out
把一个数值传入方法中,ref参数在使用前必需初始化,而out不需要(初始化也没鸟用,早晚清空)。
代码示例:
调用方法,传入引用,改变字符串的值:
static void RefOrOutTest() { string name = "张三"; RefTest(ref name); Console.WriteLine(name);//调用方法之后,原先值改变,打印: 李四! } static void RefTest(ref string str) { str = "李四"; }
static void RefOrOutTest() { string name = "张三"; OutTest(out name); Console.WriteLine(name);//调用方法之后,原先值改变,打印: 李四 } static void OutTest(out string str) { str = "李四"; }
可以看出,无论用ref还是用out,都是一样的结果!条件都一样,传入时候都进行的初始化赋值,进入方法后又重新赋值!
再进一步测试:
static void RefOrOutTest() { string name = "张三"; RefTest(ref name); } static void RefTest(ref string str) { Console.WriteLine(str);//打印: 张三 }
这样写依旧可以打印出原先的值,但是将ref改为out,编译器就会报错!
这就准确的说明了:out参数在进入方法的时候,C#会自动清空它的一切引用和指向,所以在上面的out例子中,必需先要为str参数赋值。如以下程序。
static void RefOrOutTest() { string name = "张三"; OutTest(out name); } static void OutTest(out string str) { str = "王五"; Console.WriteLine(str);//打印: 王五 }
再进一步测试:
static void RefOrOutTest() { string name; OutTest(out name); Console.WriteLine(name);//打印:王五 } static void OutTest(out string str) { str = "王五"; }
再未初始化的时候用out依旧可以传递!再来看下边用ref传递就会报错:
static void RefOrOutTest() { string name; RefTest(ref name); Console.WriteLine(name); } static void RefTest(ref string str) { str = "王五"; }
报错:
可以看出,在没有初始化的情况下,out依旧可以传递,因为就算你初始化了还是被清空,而ref就不可以,在传递前必须进行初始化
最后大概总结一下:在我们需要多个返回值的时候,就用out,在需要修改修改原先引用的时候用ref!