C#基础 out和ref复习

在平时做开发时候,调用方法获得返回值都是只能获得一个返回值的,但是有时候我们需要获得多个,比如:我想要返回一个字符串,同时还想要一个List数组,但是一个方法只能有一个return,所以在这种情况官方就提供给我们新的方法实现我们想要的结果!Ref和Out两者比较共同点:out、ref都是传递引用(内存地址),使用后都将改变原来参数的数值。不同点:ref是有进有出,out是只出不进(就是把一个参数通...

C#基础 out和ref复习

在平时做开发时候,调用方法获得返回值都是只能获得一个返回值的,但是有时候我们需要获得多个,比如:我想要返回一个字符串,同时还想要一个List数组,但是一个方法只能有一个return,所以在这种情况官方就提供给我们新的方法实现我们想要的结果!

Ref 和 Out 两者比较

共同点outref都是传递引用(内存地址),使用后都将改变原来参数的数值。

不同点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!

源文地址:https://www.guoxiongfei.cn/cntech/18354.html
0