黑马程序员技术交流社区

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

作者: 徐传任    时间: 2012-10-7 17:48
标题: ref与out
        
方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。
当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明 out 方法非常有用。
使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
属性不是变量,不能作为 out 参数传递。
作者: 邸亚星    时间: 2012-10-7 19:29
out关键字会导致参数通过引用来传递,ref相类似但是不同在于ref要求变量必须在传递之前进行初始化。
当希望返回多个值时,声明out方法很有用,
两者都是按地址传递的,使用后都将改变原来的值,out使用也能改变数值,所以是按照地址传递的。
ref可以把参数的数值传递进函数,out是要把参数清除,无法把一个数值从out传递进去,out进去后,参数数值为空,要初始化一次。ref是有进有出,out只出不进

作者: 曾家伟    时间: 2012-10-7 19:57
ref作为参数的函数在调用前,实参必须赋初始值。否则编译器将报错,out作为参数的函数在调用前,实参可以不赋初始值。


作者: 蔡嘉    时间: 2012-10-7 21:05
ref“双向”,out“单向,而且向外传”,ref需要初始化,out初始化可以,不初始化也可以。
下面的代码楼主运行一下,应该可以加深一些理解。
static void Main(string[] args)
        {
            string e="zaoan", f="china";
            outTest(out e,out f);
            Console.WriteLine("{0},{1}",e,f);
            Console.ReadKey();
            refTest(ref e, ref f);
            Console.WriteLine("{0},{1}", e, f);
            Console.ReadKey();

        }
        static void refTest(ref string a, ref string b)
        {
            Console.WriteLine("{0},{1}", a, b);
            Console.ReadKey();
            a = "hello";
            b = "world";
        }
        static void outTest(out string c, out string d)
        {
            c = "nihao";
            d = "beijing";                        
        }
作者: 赵雅晴    时间: 2012-10-8 10:09
ref ,out 其实都可以说是引用传递,区别于值传递。
引用传递 的时候 调用函数对参数的修改会反映到原来的传入的参数上,
但值传递则不会改变。传递的只是原来变量的 副本。

ref : 传递前必须初始化,
out:不必初始化,就算初始化,也会被无视,
out 作为输出参数,可以解决函数只有一个返回值的问题
作者: 徐艳勇    时间: 2012-10-8 14:55
  1. 两者都是引用传递,前者要初始值,后者可在方法中赋值
复制代码





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