黑马程序员技术交流社区

标题: 返回值问题 [打印本页]

作者: 徐传任    时间: 2012-9-24 21:28
标题: 返回值问题
out和ref都能用于传出值,而视频里老师说ref可以理解为双向的,既可以传出。但是具体有什么相同和不同的呢?麻烦详细点,谢谢
作者: 张少甫    时间: 2012-9-24 21:59
两者都是按地址传递的,使用后都将改变原来的数值。很多人在论坛上解释说out是按数值传递,是错误的。简单的测试后可以知道out使用也能改变数值的,所以肯定是按照地址传递的。
其次:rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进。
作者: 佘天宇    时间: 2012-9-24 23:28
区别在于:out在返回前必须要赋值。其的基本上基本上是一样的了,没什么区别了。
作者: 廖创发    时间: 2012-9-24 23:42
刚刚发表out和ref总结的博客,刚好用的上,下面是我从视频中总结到的,够详细的{:soso_e151:}
OUT:

使用方法:

1)在方法的参数类型前加out,那么传参数的时候,也必须在number前加out表明这个参数不是传入的,而是用来传出值的。

2)以out形式传入的参数,在传入前可以不赋初值

3)在方法中对于由out修饰的参数,必须赋值,并且必须在使用前赋值

例:static void Main(string[] args)
        {

             int number;
            int result = Test(out number);

        }

        static int Test(out int a)
        {
            a = 10;
        }


实现把a=10传给number。

ref的用法:

static void Main(string[] args)
        {     

                int    number  =10;

                Test(ref number);
            Console.WriteLine(number);
            Console.ReadKey();

        static void Test(ref int a)
            {
                a=100;
            }
    实现了把a=100赋给number

再看一例:

        static void Main(string[] args)
               {

                int    number  =100;

                Test(ref number);
            Console.WriteLine(number);
            Console.ReadKey();

    static void Test(ref int a)
            {
                int b=a;
                a=500;
            }

             上面代码实现了:把number=100传入给了a,b=a,a=500又传出给了number

由此我们可以总结出:out用于传出值,方法中必须对out修饰的传数进行赋值。ref可以理解成是双向的,既可以传入,又可以传出。在传参数的过程中,如果参数有out或ref修饰的话,那么改变方法中的参数变量的值,调用者方法中变量的中也会相应改变。

下面做一例题:

写一个方法,计算一个int类型数组中每个元素的总和和最大值,最小值

       static void Main(string[] args)
        {

            int[] number = { 4,8,2,9,5};
            //声明两个变量来接收compute方法中传入的值(out max,out min)
            int max,min;
            //声明一个sum变量来接收compute方法中返回的s的值
            int sum=compute(number,out max ,out min);
            
            Console.WriteLine("数组的总和为{0},数组中最大值为{1},最小值为{2}",sum ,max ,min);
            Console.ReadKey();
           

           }

           static int compute(int []num,out int max,out int min)
    {
    static int compute(int []num,out int max,out int min)
        {    //声明一个int类型变量s,把num[0]赋给max和min,如果min值为0,数组中元素的值都大于0,无法判断
           int  s = 0; max = num[0]; min = num[0];
            //调用一个for循环,循环判断数组中各个元素的大小,并赋值
            for (int i = 0; i < num.Length; i++)
            {
                s = s + num[i];
                //判断max和num[i]的大小,如果num[i]>max,则把num[i]赋给max
                if (max < num[i])
                {
                    max = num[i];
                    
                }
                //判断min和num[i]的大小,如果min>num[i],则把num[i]赋给min
                if (num[i]<min)
                {
                    min = num[i];
                    
                }
            }
            //返回s
            return s;         
     }



作者: 李阳Leo    时间: 2012-9-25 00:34
方法通过out接收过来的变量,必须赋值才能使用,不管你传之前有没有赋值
通过ref接收过来的变量,如果传值之前已经赋值,可以直接用,out则不行

作者: 李后量    时间: 2012-9-25 12:14
楼上的说的都够清楚的了,再说下,放在out后面的变量在该方法前赋值是无谓的,因为它不会被传入,而该变量在传出之前必须得赋值,如果是多分支的则必须在每条分支的最后都对该变量进行赋值,否则报错哦
作者: 侍小波    时间: 2012-9-25 16:30
方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。 不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。 属性不是变量,不能作为 out 参数传递。


方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。
传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。 属性不是变量,不能作为 ref 参数传递。
简单的说就是:rel是有进有出,out是只出不进。




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