黑马程序员技术交流社区

标题: 关于方法参数的引用传递的问题 [打印本页]

作者: 蔡志涛    时间: 2013-6-13 15:28
标题: 关于方法参数的引用传递的问题
对于out、ref引用方式传参数理解不太清楚,有谁能给解释下啊,另外,如果要想深入理解是不是要学学C语言里的指针??

作者: 许庭洲    时间: 2013-6-13 15:38
1. ref必须先初始化,因为是引用,所以必须先"有", 才能引用, 而out则是内部为外部赋值, 所以不需要初始化, 而且外部初始化也没用;
2. ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值.
作者: 风雪再现    时间: 2013-6-13 15:57
out:
由于函数只能有一个返回值,当需要函数处理结果之后有多个返回值,就要用到out。如下例:
static void Math(int[] array, out int max, out int min)//函数的作用:传入一个整形数组,可以传出数组中的最大值和最小值;max接收传出的最大值,min接收传出的最小值;
        {
            max=array [0];
            min=array [0];
            for (int i = 0; i < array.Length; i++)
            {
                if (array[i] > max)
                {
                    max = array[i];
                }
                if (array[i] < min)
                {
                    min = array[i];
                }
            }
        }
其实,最常用到out的就是int.TryParse(string str,out int i);
ref:是把变量带进方法中,重新赋值之后再带出来。也就是传入的时候传入的是变量的地址,如下例:
static void Test(ref int i)
        {
            int a = 10;
            i = a;
        }
当调用这个函数时,如果不加ref,传入的参数i结果不会发生变化,但是加了ref之后,无论i之前为何值,运行函数之后i=10;
最后:out修饰的变量不需要定义初值,ref修饰的变量必须赋初值。

作者: 风雪再现    时间: 2013-6-13 16:07
不需要刻意去学C语言里面的指针
作者: 穆玉明    时间: 2013-6-13 17:20
out 用于传出值,所以方法中必须对out修饰的参数赋值
ref可以理解是双向的,既可以传入,又可以传出
作者: 詹卓锋    时间: 2013-6-13 17:34
许庭洲 发表于 2013-6-13 15:38
1. ref必须先初始化,因为是引用,所以必须先"有", 才能引用, 而out则是内部为外部赋值, 所以不需要初始化,  ...

如果在一个方法中,由out修饰的参数,在方法内这个参数要初始化,不然会报错,外部初始化是没有用的

out初始化.jpg (18.89 KB, 下载次数: 0)

out初始化.jpg

作者: 蔓越莓    时间: 2013-6-13 18:55
ref(引用)可以传入也可以传出,使用的时候修改ref的值,他原先的值也会改变。使用ref前必须对变量赋值
out(输出)只出不进;如果函数结束后没有给out修饰的变量赋值,就会报错(当然嘛,它的存在就是为了把值带出去,不给他赋值肯定得出错)。

作者: 高腾    时间: 2013-6-14 07:28
对于值类型的参数,当作为参数传递时,默认传递的是一份复制值,而不是变量
当使用ref声明时,表示把当前需要传入的变量传过去,不是拷贝,就是该变量在内存空间中指向的值的地址
out是内部对外部赋值,多用于返回多个值,比用数组返回多个值要方便的许多
两者主要区别是在使用ref时,需对参数先赋值进行初始化;使用out时先初始化也没用,因为是内部对外部赋值

另外对于C语言中的指针问题,实际上就是传递对象所指向内存空间的地址,也就是传递一个引用(这个引用表示引用的一个地址)
理解好了就不需要看指针了 之后C#学习中还会遇到函数指针 就是所说的委托
作者: popoluno    时间: 2013-6-14 14:13
如果有指针基础最好,不过不知道也没事
ref必须先初始化,因为是引用,所以必须先"有", 才能引用, 而out则是内部为外部赋值, 所以不需要初始化, 而且外部初始化也没用。ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值.




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