黑马程序员技术交流社区

标题: out和ref有什么区别? [打印本页]

作者: 陈世伟    时间: 2012-4-20 15:44
标题: out和ref有什么区别?
out和ref都可以传入,也可以传出,但是区别在out必须赋初值,ref不用,这样理解对吗?
作者: 王连    时间: 2012-4-20 16:07
out和ref
out用于传出值,在方法中必须对out修饰的传输进行赋值;
ref可以理解为是双向的,即可以传入,又可以传出;
在传参数的过程中,如果参数有out或ref修饰的话,那么改变方法的参数变量的值,调用者方法中变量的值也会相应改变;
作者: 柏云杉    时间: 2012-4-20 16:12
本帖最后由 柏云杉 于 2012-4-20 16:22 编辑

首先 OUT只传出没有传入 ref才是传入并传出。
  1. public void OutTest(out int i)//这个 i 是定义在OutTest方法里得局部变量,并未赋值。它的值是null
  2. {
  3.        i = 0; // 所以在使用前需要赋初值。
  4.        i++;
  5. }
复制代码
  1. public void Test()
  2. {
  3.         int j = 9;
  4.         RefTest(ref j);
  5. }
  6. public void RefTest(ref int i) //这个 i 也是定义在RefTest方法里得局部变量
  7.                                      // 并且用来接收调用这个方法时传入的变量的值,也就是上面那个变量 j 的值。
  8.                                      // 如果传入的变量为null,那么 i  也是 null
  9. {
  10.       i++;// 因为 i 赋值过了所以可以直接使用,无需再赋值。如果 i = null,只会报为null的异常不会报错说 i 为赋值。
  11. }
复制代码

作者: 丁官林    时间: 2012-4-20 17:36
ref ,out 其实都可以说是引用传递,区别于值传递。
引用传递 的时候 调用函数对参数的修改会反映到原来的传入的参数上,
但值传递则不会改变。传递的只是原来变量的 副本。

1、使用ref型参数时,传入的参数必须先被初始化。对out而言,不必初始化,就算初始化,也会被无视,只能在方法中对其完成初始化。  

2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。  

3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。  
作者: 忘忧草    时间: 2012-4-20 22:11
简而言之:
ref : 传递前必须初始化,  
out:不必初始化
作者: 李宗鹏    时间: 2012-4-21 00:33
两者都是按地址传递的,使用后都将改变原来的数值。很多人在论坛上解释说out是按数值传递,是错误的。简单的测试后可以知道out使用也能改变数值的,所以肯定是按照地址传递的。
其次:rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进
作者: ︻◣㊣袏邊愛☆    时间: 2012-4-24 18:38
学习了谢谢
作者: ︻◣㊣袏邊愛☆    时间: 2012-4-24 18:41
学习了谢谢Ddd




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2