CLR via C#学习笔记-第九章-可选参数和命名参数

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