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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐传任 中级黑马   /  2012-9-24 21:28  /  1481 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

out和ref都能用于传出值,而视频里老师说ref可以理解为双向的,既可以传出。但是具体有什么相同和不同的呢?麻烦详细点,谢谢

评分

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

查看全部评分

6 个回复

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

评分

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

查看全部评分

回复 使用道具 举报
区别在于:out在返回前必须要赋值。其的基本上基本上是一样的了,没什么区别了。

评分

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

查看全部评分

回复 使用道具 举报
刚刚发表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;         
     }


评分

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

查看全部评分

回复 使用道具 举报
方法通过out接收过来的变量,必须赋值才能使用,不管你传之前有没有赋值
通过ref接收过来的变量,如果传值之前已经赋值,可以直接用,out则不行

评分

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

查看全部评分

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


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