A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈世伟 黑马帝   /  2012-4-20 15:44  /  1763 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

out和ref都可以传入,也可以传出,但是区别在out必须赋初值,ref不用,这样理解对吗?

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

7 个回复

倒序浏览
out和ref
out用于传出值,在方法中必须对out修饰的传输进行赋值;
ref可以理解为是双向的,即可以传入,又可以传出;
在传参数的过程中,如果参数有out或ref修饰的话,那么改变方法的参数变量的值,调用者方法中变量的值也会相应改变;

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 柏云杉 于 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. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

回复 使用道具 举报
ref ,out 其实都可以说是引用传递,区别于值传递。
引用传递 的时候 调用函数对参数的修改会反映到原来的传入的参数上,
但值传递则不会改变。传递的只是原来变量的 副本。

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

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

3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。  

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
简而言之:
ref : 传递前必须初始化,  
out:不必初始化

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
两者都是按地址传递的,使用后都将改变原来的数值。很多人在论坛上解释说out是按数值传递,是错误的。简单的测试后可以知道out使用也能改变数值的,所以肯定是按照地址传递的。
其次:rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
学习了谢谢
回复 使用道具 举报
学习了谢谢Ddd
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马