黑马程序员技术交流社区

标题: 怎么理解out和ref? [打印本页]

作者: 宋清飞    时间: 2013-10-23 23:46
标题: 怎么理解out和ref?
本帖最后由 宋清飞 于 2013-10-24 13:22 编辑

感觉out还比较好理解,用它从方法里传出一个值来,还能用得明白。教程里说ref可以看成是双向的,可以传入传出,好像懂了又好像没懂,不太好理解,谁能来跟参照out来说说怎么理解ref。

作者: 喜之郎果冻    时间: 2013-10-23 23:55
out侧重于返回多个值。既然你明白就不多说了。而ref则是侧重于将将一个参数带入到方法中进行改变然后再带出来。就是说一个方法就算没有返回值,带入了ref参数,其外部的值一样会改变。例如:
  1. static void Main(string[] args)
  2.         {
  3.             //写一个方法,交换两个int类型的变量
  4.             int n1 = 10;
  5.             int n2 = 20;
  6.             Change(ref n1,ref  n2);
  7.             Console.WriteLine(n1);
  8.             Console.WriteLine(n2);
  9.             Console.ReadKey();
  10.         }

  11.         public static void Change(ref int n1,ref  int n2)
  12.         {
  13.             int temp = n1;
  14.             n1 = n2;
  15.             n2 = temp;
  16.         }
  17.     }
  18. }

复制代码
假如这个方法没有ref参数,那么调用这个方法后变量的原值是不会改变的,因为这个方法并没有返回任何值。当使用了ref参数就相当于将变量带入方法中进行计算,计算完后在带出来。
作者: 姚团结    时间: 2013-10-24 01:16
ref传参传递的是对象的引用,而不是值的副本:

            int age = 20;
            IncAge(ref age);
            Console.WriteLine(age);//输出结果21.

            static void IncAge(ref int age)
            {
                age++;
            }
    ref应用场景内部对外部的值进行改变,out则是内部对外部变量进行赋值,out一般应用在函数有多个返回值的场所。

            int age;
            IncAge(out age);
            Console.WriteLine(age);//输出结果41

           static void IncAge(out int age)
            {
                age = 40;
                age++;
            }
作者: haxyek    时间: 2013-10-24 09:02
ref参数:如果吧一个参数传递给方法,但这个方法的输入参数带ref,则该方法对变量所做的改变会影响原始的值,即:原始必须赋初始值。可以做传入,改变,传出
out参数:只是为了传出。所以不需要赋初始值。

作者: 杨靖    时间: 2013-10-24 09:48
本帖最后由 杨靖 于 2013-10-24 14:27 编辑

我觉得单看结果的话,没什么区别,用ref和out标记的参数,他们的值最终都取决于方法中对该参数的赋值(ref标记的参数在被调用的方法中可赋值可不赋值)。
唯一的区别就是ref在传参之前,必须对变量进行赋初值,而out因为仅仅是传出作用,所以无需赋初值。
如果还不明白,还可以查看MSDN中对这两个关键字的区分。附上链接:
out:http://msdn.microsoft.com/zh-cn/library/t3c3bfhx(v=vs.90).aspx
ref:http://msdn.microsoft.com/zh-cn/library/14akc2c7(v=vs.90).aspx
希望能帮到你。
作者: ィSlick    时间: 2013-10-24 12:49
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);
 }
}
作者: V_John    时间: 2013-10-24 13:05
这是我学习的笔记:
用 out 声明变量和 ref 声明的变量有什么共同点和区别?
1:两者都是引用型参数,在方法中对变量做的任何修改(例如赋值)都会反映在变量上
2:out声明的参数不需要初始化
3:用ref声明的参数需要初始化才可以使用,这样就可以传入传出了,基本上用ref的占多数

作者: 宋清飞    时间: 2013-10-24 13:21
嗯,对谢各位的总结,大概理解了!
作者: 追溯客    时间: 2013-10-25 12:07

同学给你加分了!好好学习!蔡蔡和叶叶在黑马等着你!黑马有你更精彩!快点为了当土豪努力吧!





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