9.1 可选参数和命名参数
设计方法的参数时,可为部分或全部参数分配默认值。
然后调用这些方法的代码可以选择不提供部分实参,使用其默认值。
此外调用方法时可通过指定参数名称来传递实参。
private static void M(Int32 x=9,String s="A",DateTime dt=default(DateTime),Guid guid=new Guid()){}
如果调用时省略了一个实参,C#编译器会自动嵌入参数的默认值。
规则和原则
如果在方法中为部分参数指定了默认值
1.可为方法、构造器和有参属性(C#索引器)的参数指定其默认值。
2.有默认值的参数必须放在没有默认值的所有参数之后。但参数数组这种参数必须放在所有参数之后,数组本身不能有默认值。
3.默认值必须是编译时能确定的常量值。如基元类型、枚举、能设置为null的任何引用类型。
4.不要重命名参数变量,否则任何调用者以传参数名的方式传递实参,他们的代码也必须修改。
//不要这样做 private static String MakePath(String filename="Untitled") { return String.Format(@"C:{0}.txt",filename); } //而要这样做 private static String MakePath(String filename=null) { return String.Format(@"C:{0}.txt",filename??"Untitled"); }
5.如果参数用ref或out关键字进行了标识,就不能设置默认值。因为没有办法为这些参数传递有意义的默认值。
使用可选或命名参数调用方法时要注意
1.实参可按任意顺序传递,但命名实参只能出现在实参列表的尾部
2.可按名称将实参传给没有默认值的参数,但所有必须的实参都必须传递,编译器才能编译代码。
3.C#不允许省略逗号之间的实参。
4.如果参数要求ref/out,为了以传参数名的方式传递实参,使用以下语法
private static void M(ref Int32 x){} Int32 a=5; M(x:ref a);