黑马程序员技术交流社区

标题: 方法中out、ref、params有什么作用,什么时候使用。。 [打印本页]

作者: 梦里不知身是客    时间: 2014-7-26 12:00
标题: 方法中out、ref、params有什么作用,什么时候使用。。
本帖最后由 梦里不知身是客 于 2014-7-27 11:52 编辑

大神解惑。。。
作者: 蔡爽    时间: 2014-7-26 12:13
一: ref 只是一个地址。
在使用这个修饰符的时候必须要进行提前赋值(初始化),因为你不能把一个变量放到一个找不到的地址中。而且必须要显示修饰这个变量。

因为在进入方法(函数中)ref 传递的变量还是它自己,所以任何修改都会反映到ref 变量中。


例子:(我比较懒这个例子是从网上黏贴的)


    class gump
    {
        public double square(ref double x)
        {
            x = x * x;
            return x;
        }
    }

    class TestApp
    {
        public static void Main()
        {
            gump doit = new gump();

            double a = 3;
            double b = 0;

            Console.WriteLine("Before square->a={0},b={1}", a, b);

            b = doit.square(ref a);
            Console.WriteLine("After square->a={0},b={1}", a, b);
        }
    }

二、 out 是一个传递引用。

因为是引用,所以不必提前赋值,而且即使赋值也没有用当这个引用被声明的时候是空的!即在方法(函数)中使用的时候,out 变量会被清空。也就成了一个没人住的房子的门牌号了。不过不能用out 变量给out 变量赋值。而且因为.net不接受只有地址没有值的参数,out 变量是必须被赋值的。

例子:(同上)

    class gump
    {
        public void math_routines(double x, out double half, out double squared, out double cubed)
        //可以是:public void math_routines(//ref double x,out double half,out double squared,out double cubed)
        //但是,不可以这样:public void math_routines(out double x,out double half,out double squared,out double cubed),对本例来说,因为输出的值要靠x赋值,所以x不能再为输出值
        {
            half = x / 2;
            squared = x * x;
            cubed = x * x * x;
        }
    }

    class TestApp
    {
        public static void Main()
        {
            gump doit = new gump();

            double x1 = 600;
            double half1 = 0;
            double squared1 = 0;
            double cubed1 = 0;

            /*
             double x1=600;
             double half1;
             double squared1;
             double cubed1;
            */

            Console.WriteLine("Before method->x1={0}", x1);
            Console.WriteLine("half1={0}", half1);
            Console.WriteLine("squared1={0}", squared1);
            Console.WriteLine("cubed1={0}", cubed1);

            doit.math_rountines(x1, out half1, out squared1, out cubed1);

            Console.WriteLine("After method->x1={0}", x1);
            Console.WriteLine("half1={0}", half1);
            Console.WriteLine("squared1={0}", squared1);
            Console.WriteLine("cubed1={0}", cubed1);
        }



ref out 总结:ref侧重修改.out侧重输出,即使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。 out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

还有就是 ref ,out  不能同时重载一个方法。



三、 params 键字在方法成员的参数列表中使用,为该方法提供了参数个数可变的能力它在只能出现一次并且不能在其后再有参数定义,之前可以。

例子:

class App
    {
        //第一个参数必须是整型,但后面的参数个数是可变的。
        //而且由于定的是object数组,所有的数据类型都可以做为参数传入
        public static void UseParams(int id, params object[] list)
        {
            Console.WriteLine(id);
            for (int i = 0; i < list.Length; i++)
            {
                Console.WriteLine(list[i]);
            }
        }

        static void Main()
        {
            //可变参数部分传入了三个参数,都是字符串类型
            UseParams(1, "a", "b", "c");
            //可变参数部分传入了四个参数,分别为字符串、整数、浮点数和双精度浮点数数组
            UseParams(2, "d", 100, 33.33, new double[] { 1.1, 2.2 });

            Console.ReadLine();
        }
    }
作者: 梦里不知身是客    时间: 2014-7-27 11:50
蔡爽 发表于 2014-7-26 12:13
一: ref 只是一个地址。
在使用这个修饰符的时候必须要进行提前赋值(初始化),因为你不能把一个变量放到 ...

太详细了,谢谢啦,学到不少。。。
作者: Kevion小远    时间: 2014-7-27 21:37
路过学习了,哈哈。
作者: 蔡爽    时间: 2014-7-28 09:28
梦里不知身是客 发表于 2014-7-27 11:50
太详细了,谢谢啦,学到不少。。。

共同进步,嘿嘿
作者: hujiapeng    时间: 2014-7-29 13:51
解释的很到位,共同学习了,谢谢




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