zoukankan      html  css  js  c++  java
  • 参数:可选参数和命名参数

    设计一个方法的参数时,可部分或全部参数分配默认值。然后,调用这些方法的代码可以选择不指定部分实参,接受其默认值。

    此外,调用方法时还可以通过指定参数名称的方式为其传递实参。

    演示代码如下:

    public static class program
    {
        private static int sn = 0;
        private static void M(int x = 9, string s = "A", DateTime dt = default(DateTime), Guid guid = new Guid())
        {
            Console.WriteLine("x={0},s={1},dt={2},guid={3}", x, s, dt, guid);
        }
    
        static void Main(string[] args)
        {
            M();//全部显示默认值
            M(8, "X");
            M(5,guid:Guid.NewGuid(),dt:DateTime.Now);//guid,dt为指定的参数名称
            M(sn++,sn++.ToString());//这里结果为x = 0, s = 1是因为sn++先执行后进行了+1运算,这个M方法结束后sn为2
      
         M(s:(sn++.ToString()),x:sn++); Console.ReadKey();
      }
    }
    //输出结果依次为:
    //x=9,s=A,dt=0001/1/1 星期一 0:00:00,guid=00000000-0000-0000-0000-000000000000
    //x=8,s=X,dt=0001/1/1 星期一 0:00:00,guid=00000000-0000-0000-0000-000000000000
    //x=5,s=A,dt=2017/1/12 星期四 8:55:47,guid=6387f914-cd37-4aa8-a144-2524e4972a44
    //x = 0, s = 1, dt = 0001 / 1 / 1 星期一 0:00:00,guid=00000000-0000-0000-0000-000000000000
    //x=3,s=2,dt=0001/1/1 星期一 0:00:00,guid=00000000-0000-0000-0000-000000000000
    

      在定义的方法中,如果为部分参数指定了默认值,注意以下额外的规则和原则:

    1.可以为方法、构造器方法和有参属性(c#索引器)的参数指定默认值。还可以为属于委托定义的一部分的参数指定默认值。然后在调用该委托的一个变量时,可以省略实参,以接受默认值。

    2.有默认值的参数必须放在没有默认值的参数之后(左边),例如上面string s没有默认值则出现变异错误。"参数数组"除外,这种参数放在所有参数之后,而数组本身不能有默认值。

    3.默认值必须是编译时能确定的常量值。c#认定的基元类型,枚举类,以及能设为null的任何引用类型可设为默认值。对于任何值类型的参数,可将默认值设为值类型的一个实例,并让它

    的所有字段都包含零值。可用default和new来表达这个意思。(如上例dt,guid)

    4.不要重命名参数变量。否则,任何调用这如果以传参数名的方式传参都必须修改他们的代码。

    5.如果方法是从模块的外部调用,更改参数的默认值具有潜在危险性。

    6.如果参数用ref或者out关键字标识,就不能设置默认值,因为没有办法为这些参数传递一个有意义的默认值。

    使用可选或命名参数调用一个方法时,还有以下额外规则:

    1、实参可按任何顺序传递,但是,命名实参只能在参数列表最后。

    2、可按名称将实参传给没有默认值的参数。但是,所有要求的实参都必须传递(按位置或按名称)

    3、c#不允许省略逗号之间的实参。

    如果参数需要ref/out,为了以传参数值的方法传递实参,使用下面的语法:

    //方法声明

    private static void M(ref int x){...}

    //方法调用

    int=5;

    M(x:ref a);

  • 相关阅读:
    正则表达式(转)
    Collections中的shuffle()方法
    Fermat定理
    哈希算法(转)
    Hungarian method (匈牙利算法)----解决指派问题(转)
    蒙塔卡洛模拟
    线程的礼让
    线程间的沟通
    安装rlwrap
    yum切到光盘源
  • 原文地址:https://www.cnblogs.com/lanrenqilanming/p/6276900.html
Copyright © 2011-2022 走看看