首页 > 代码库 > 黑马程序员_浅谈out参数、ref参数和可变参数

黑马程序员_浅谈out参数、ref参数和可变参数

1、out参数

        out关键字会导致参数通过引用来传递,通俗点说,就是往外传值的。

     out参数的作用:用于以内部变量为外部变量赋值的,out一般适用于某个方法不只是使用return返回单个值,而是需要有多个返回值的情况。

     out参数的使用需要注意以下几点:

    1)out参数传递的变量在传递之前不需要对其进行初始化。

        分析:在调用方法之前,对out参数传递的变量只需声明,可以赋值也可以不赋值,不过反正都是要在调用时被覆盖掉,所以大可不必赋值,因为赋值了虽然不会报错,但却根本也没有用处,没必要多此一举!(详见以下代码)

    2)如果方法的参数有使用out关键字修饰时,在调用该方法时,记住也要在out参数传递的变量前面加上out才行。

        分析:加上out能表明这个参数不是传入的,而是传出值的,但是out修饰的参数依然可以传入值;不加out关键字,会使得该 参数成为无效参数而报错。

    3)方法使用了out参数传递变量时,就是要返回值,所以必须在方法返回值或方法结束之前,对out所修饰的变量进行赋值。

 1         static void Main(string[] args) 2         { 3             int rst;   //out修饰的变量在调用之前只需声明即可 4             int num=8; 5             if (isMod(num, out rst))   //记住加上out修饰变量 6             { 7                 Console.WriteLine("{0}是偶数,{0}/2={1}", num, rst); 8             } 9             else10             {11                 Console.WriteLine("{0}不是偶数",num);12             }13             Console.ReadKey();14         }1516         public static bool isMod(int number,out int result)//通过参数返回值17         {18             if (number % 2 == 0)19             {20                 result = number / 2;  //方法结束之前必须对result赋值21                 return true;22             }23             else24             {25                 result = 0;  //方法结束之前必须对result赋值26                 return false;27             }28         }

           在上述代码中,out 修饰了rst 和result 两个变量,就相当于在它们之间建立了一种联系,对result 进行赋值也就是对rst进行赋值,等于把方法中的局部变量的值返出去了,成功达到了通过参数返值的目的。

      4)另外,若是要在方法内部使用out 修饰的变量,如上述程序,在isMod 方法中使用result 之前,必须先对其进行赋值才能使 用。虽然可能在isMod 方法被调用之前,已经对rst 赋值,比如 rst=2,当参数rst 以out 形式传入时,result 虽然也能收到rst 传来的值,即调用时result 也等于2,然而,在isMod 方法里想要使用result 变量时,还是必须先要对它赋一次值,这就显得调用之前的赋值变得毫无意义。

2、Ref参数

       ref 关键字,同out一样,可以使得参数通过引用来传递。换句话说,ref能够让你直接对原来那个数进行操作,而不是将原数复制一份,对那个复制项进行操作。

       ref参数的作用:与out不同的是,它可以双向传值,主要适用于场景内部对外部的值进行改变的情况。

       ref参数的使用需要注意以下几点:

      1)ref参数传递的变量在传递之前一定要对其进行初始化赋值。

          分析:ref本来就适用于场景内部对外部的值进行改变的情况,所以在传参之前,一定要对其赋初值,才能有值传过去。

      2)如果方法的参数有使用ref关键字修饰时,在调用该方法时,记住也要在ref参数传递的变量前面加上ref才行。

          分析:加上ref能表明这个参数既是传入的,又可以是传出值的,不加ref关键字,会使得该参数成为无效参数而报错,num和number两个变量都使用了ref来修饰,使得number指向了num,所以在Test方法中对number进行操作时,就是对num进行操作。(详见以下代码)

 1        static void Main(string[] args) 2         { 3             int num = 100;  //ref修饰的变量,必须对其赋初值 4             Test(ref num);  //记住加上ref变量 5             Console.WriteLine(num); 6             Console.ReadKey(); 7         } 8  9         public static void Test(ref int number)10         {11             int numA = number;12             number = 2; //不一定要赋值13         }

    3)方法使用了ref参数传递变量时,不同于out,没有要求一定在方法返回值或方法结束之前,对ref所修饰的变量进行赋值,所以可以不赋值。

    4)另外,若是要在方法内部使用ref修饰的变量,如上述程序,在Test方法中使用number之前,因为要求已经对即将传入的num,赋了初值100,不同于out,此时可以在Test方法内直接使用number变量,并且,当参数num以ref形式传入时,number就能收到num传来的值,即调用时number也等于100,之后改变number的值,也同时改变了num的值。

3、可变参数

     params 是关键字,可以使得在参数个数可变处采用参数的数组型参数,比如 int sum(params int[] values)。

    可变参数的作用:使得个数不确定的可变参数以数组的形式传递,适合于方法的参数个数未知的情况时,用于传递大量的数组集合参数。

    可变参数在使用时需注意:

     1)不允许将params修饰符与refout修饰符组合起来使用。

     2)当方法的参数列表中有多个参数时,params修饰的参数必须放在最后,不能放在前面,以免程序不好确定参数究竟有多少个而报错。比如: int sum(string name,params int[] values)

     3) 一个方法当然可以包含可变参数和不变参数,两个可以同时使用。

    这样,有了可变参数,就可以在某些情况下根据特定的需要来确定方法的参数个数。

    小结:

    这是我的第一篇学习日记,知识点可能讲的不是很细,但其中的每一点都是我自己归纳出来的,以前只学过点C++基 础,没接触过C#,更不知道有Out参数、Ref参数和可变参数这三个概念,通过学习黑马基础入门视频的C#编程基础部分,以及查阅相关资料,对这三个知识点已经能够基本掌握,还记得当初跳着看视频,不能理解调用int.TryParse方法时,为什么要在参数前加上out,out又有什么作用,现在已经能清楚地运用它们了。即使这是些很简单的内容,但是却是很重要的基础,我需要把它记录下来,以便于提醒自己。现在发现,写学习笔记不仅可以提高自己的表达能力,还有助于学习。

    我告诉自己,需要坚持下去!

详细请查看:www.itheima.com