设计一个方法的参数时,可部分或全部参数分配默认值。然后,调用这些方法的代码可以选择不指定部分实参,接受其默认值。
此外,调用方法时还可以通过指定参数名称的方式为其传递实参。
演示代码如下:
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);