黑马程序员技术交流社区

标题: out与ref [打印本页]

作者: 肖云    时间: 2012-6-7 12:24
标题: out与ref
在方法中,out 用来传出值,ref 既可以传入,也可以传出;但是程序在调用方法的时候,就可以直接传值给方法中的参数,那么还用的着ref吗?什么地方用?
如:以下方法中的参数值既可以传入,也可以传出:
int[] nums={1,3,4,6,2,5};
int max,min,sum;
sum=compute(nums,out max,out min);
Static int compute(int[] numbers,out int max,out int min)
{

}
作者: 班顶超    时间: 2012-6-7 12:32
既然存在那当然有道里了
调用ref参数方法时,必须先要给值初始化。
调用out参数方法时,必须要在方法体里给他初始化。

out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
作者: 钟山山    时间: 2012-6-7 13:06
       ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。
使用ref前必须对变量赋值,out不用。
out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。
       区别可以参看下面的代码:

using System;
class TestApp
{
 static void outTest(out int x, out int y)
 {//离开这个函数前,必须对x和y赋值,否则会报错。
  //y = x;
  //上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行
  x = 1;
  y = 2;
 }
 static void refTest(ref int x, ref int y)
 {
  x = 1;
  y = x;
 }
 public static void Main()
 {
  //out test
  int a,b;
  //out使用前,变量可以不赋值
  outTest(out a, out b);
  Console.WriteLine("a={0};b={1}",a,b);
  int c=11,d=22;
  outTest(out c, out d);
  Console.WriteLine("c={0};d={1}",c,d);

  //ref test
  int m,n;
  //refTest(ref m, ref n);
  //上面这行会出错,ref使用前,变量必须赋值

  int o=11,p=22;
  refTest(ref o, ref p);
  Console.WriteLine("o={0};p={1}",o,p);
 }
}
作者: 朱亮辉    时间: 2012-6-7 13:35
方法参数传递,从方式上来说分为,值传递方式和引用传递方式。ref和out都属于引用传递,对参数的任何操作都会反映在原变量上,而值传递只是变量的一个备份。

ref与out的区别
1、ref 参数的参数必须最先初始化(在方法初始化之前)out就可以不必在初始化之前必须声明
2、不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。

如果要返回多个变量使用out是个不错的解决方案噢
作者: 王国文    时间: 2012-6-7 13:46
使用ref型参数时,传入的参数必须先被初始化
对out而言,必须在方法中对其完成初始化
使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配
out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候
  1. class TestApp
  2.   {
  3.   static void outTest(out int x, out int y)
  4.   {
  5.   x = 1;
  6.   y = 2;
  7.   }
  8.   static void refTest(ref int x, ref int y)
  9.   {
  10.   x = 1;
  11.   y = x;
  12.   }
  13.   public static void Main()
  14.   {
  15.   int a, b;
  16.   outTest(out a, out b);
  17.   Console.WriteLine("a={0};b={1}", a, b);
  18.   int c = 11, d = 22;
  19.   outTest(out c, out d);
  20.   Console.WriteLine("c={0};d={1}", c, d)

  21.   int o = 11, p = 22;
  22.   refTest(ref o, ref p);
  23.   Console.WriteLine("o={0};p={1}", o, p);
  24.   }
  25.   }

复制代码

作者: 刘豪    时间: 2012-6-7 15:04
肯定有用的啦,微软不会无聊到整出个没用的东西来。
作者: G_Xiaotao    时间: 2012-6-7 16:48
上面所说的返回多个参数  能否举个例子呢?  我也知道ref在使用时必须先初始化 out是在方法中初始化 但是就是不是很理解你们所说的在返回多个参数是用ref比较好一点  怎么个好法呢?
作者: G_Xiaotao    时间: 2012-6-7 16:48
朱亮辉 发表于 2012-6-7 13:35
方法参数传递,从方式上来说分为,值传递方式和引用传递方式。ref和out都属于引用传递,对参数的任何操作都 ...

上面所说的返回多个参数  能否举个例子呢?  我也知道ref在使用时必须先初始化 out是在方法中初始化 但是就是不是很理解你们所说的在返回多个参数是用ref比较好一点  怎么个好法呢?
作者: 王针    时间: 2012-6-7 18:51
如果你要传的参数是个数据量非常大的变量,用一般的传参方式,拷贝一份穿进去,一个参数还可以,如果有很多这样的参数的话,效率肯定就很低了。所以用ref的话就只需要传一个引用。我是这样理解的。




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