参数:可选参数和命名参数

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

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

演示代码如下:

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);

原文地址:https://www.cnblogs.com/lanrenqilanming/p/6276900.html