函数参数及返回值

来源:互联网 发布:网络攻击分类排名 编辑:程序博客网 时间:2024/05/16 07:08

  方法(函数)在普遍意义下,将有传入参数和传出参数,void型的函数其实也不例外。
  一般情况下,函数通过return语句返回参数,如果也返回多组(无论是单个变量还是集合参数)参数,则要借助传入ref参数。下面,对函数的内容进行一般性的总结。
一、使用可选参数
   为了使用可选参数,可以在定义方法时为该参数提供默认值,如下:
                                    void optMethod(int first, double second=0.0, string third="Hello");
   在上述函数中,first是必选参数,而second和third参数是可选的。默认形参从有到左,也就是所有可选参数必须在必选参数后面。可以像下面一样调用这个函数:
                                   optMethod(99,123.45,"World");
                                   optMethod(99,123.45);
                                   optMethod(99,"World");可以吗?还要求证
二、传递命名参数
   C#默认根据参数位置判断实参对应的形参,如上。现在,C#还允许按照名称指定参数,利用这个功能,就可以按照不同的顺序传递实参啦!为了将一个实参作为命名参数来传递,必须输入参数名,一个冒号,然后就是要传递的值。如下:
                                  optMethod(first:99,second:123.45,third:"World");
                                  optMethod(first:99,second:123.45);
   利用命名参数,实参可以按任意顺序传递,就像下面这样重写调用optMethod方法的代码:
                                  optMethod(second:123.45,first:99);
   也可以指定部分,剩下可选参数用默认值。如下,second使用默认形参
                                  optMethod(first:99,third:"World");
三、消除可选参数和命名参数的歧义
    这里,举两个例子就可以啦!
                        void optMethod(int first, double second=0.0,string third="Hello");
                        void optMethod(int first, double second=1.0,string third="GoodBye", int fourth=10);
    当我们像下面这样调用时:
                        optMethod(1,2.5,"World");
    我们根本不清楚,是调用哪一个函数,事实上,是这样的么?实际上,调用的是和方法最匹配的那个版本,所以,最后选择的是获取3个参数的版本,而不是四个。

四、可变数量形参——参数数组
    4.1:声明params数组
      params关键字可以作为一个数组参数的修饰符来使用。其作用是可以传递任意数量的参数个数。例如:  
                        public static int Min(params int[] paramList)
                         {}
      1)如果要判断两个整数值哪个大,可以像下面这样调用:int min=Min(first,second);
      2)如果要判断三个整数值哪个大,可以像下面这样调用:int min=Min(first,second,third);
      如果不定义params参数数组,那么就要写两个形参数量不同的方法,即通过重载来实现,略显麻烦吧!
      注意:
    1)只能为一维数组使用params关键字
    2)不能依赖关键字params来重载一个方法,其不构成方法签名的一部分,如下例,编译时出错(重复定义):
                        public static int Min(int [] paramsList)
                        public static int Min(params int[] paramList)
    3)不允许为params数组指定ref或out修饰符
    4)params数组必须是形参表的最后一个参数,这也说明一个函数的形参当中最多只能有一个params参数
    5)非params方法总是优于params方法,也就是说如果愿意,仍可以创建一个方法的重载版本,让其应用更常规的情况,如下:
                        public static int Min(int leftHandSide,int rightHandSide)
                        public static int Min(params int[] params)
      注意其和2)中“所谓”重载的区别。
     6)编译器会拒绝有歧义的重载。例如,以下两个Min方法就存在歧义,如果传递两个int型参数,将无法分辨具体应该调用哪个,编译时出错:
                        public static int Min(params int[] params)
                        public static int Min(int,params int[] params)

    4.2:使用params object[]数组参数
     4.1中int型的参数数组非常有用,因为它允许在一个方法调用中传递任意数量的int参数。然而,假如参数的数量不固定,参数类型也不固定,又该怎么办?C#也提供了一种技术来解决,即params object[]数组参数,其定义如下:
                          public static int Min(params object[] paramList)
                         {}
      其有以下特性:
      1)可以不向其传递任何实参,在这种情况下,相当于编译器传递了长度为0的object数组
      2)可以传递null作为实参,因为数组是引用类型,所以允许null来初始化数组
      3)可以向该方法传递一个实际的数组
      4)可以向该方法传递不同类型的其他任何参数
五、引用参数——引用参数可以用来返回函数变量。
       通常,向方法传递一个参数时,对应的参数(形参)会用实参的一个副本来初始化。不管参数是值类型(如int)、可空类型(如int?)、还是引用类型(如WrappedInt),这一点都成立,换言之,随便在方法内部对形参进行什么修改,都不会影响作为参数来传递的一个变量的原始的值。
      4.1:ref
      如果一个参数(形参)附加了ref关键字作为前缀,那么该参数就会成为实参的一个别名(或者为实参的一个引用),而不再是实参的一个副本。使用ref参数时,对参数的任何操作,都会同样应用于实参,因为实参和形参引用的是同一个对象。
      4.2:out
      ref参数在使用前,必须赋值。但是,有的时候,我们希望由方法本身来初始化参数,所以希望向其传递一个未初始化的参数。out关键字正是针对这一需求设计的。
      4.3:ref和out的区别
      这两者非常相像,同样可以使形参变为实参的一个别名,而不再是副本,其区别在于:
      1)out是output的简称,在向方法传递一个out参数之后,必须在其方法内部对其进行赋值,否则代码无法编译。
                               static void DoInitialize(out int param)
                               {
                                      //param=42;
                               }
                               static void Main()
                               {
                                      int arg;
                                      DoIntialize(out arg);
                                      Console.WriteLine(arg);//如果在DoInitalize里面没有初始化param,编译错误,否则显示42
                               }
      2)ref参数使用前必须初始化,而out参数则不必。即所谓的ref有进有出,out只出不进。

原创粉丝点击