设计方法的参数时,可为部分或全部分配默认值。然后调用这些方法的代码可以选择不提供部分实参,使用其默认值。此外,调用方法时可通过制定参数名称来传递实参。
调用时省略了一个实参,C#编译器会自动嵌入参数的默认值。
向方法传递实参时,编译器按从左到右的顺序对实参进行求职。
//--
规则和原则
1.可为方法、构造器方法和有参属性(C#索引器)的参数指定默认值。还可以为属于委托定义一部分的参数指定默认值。
2.有默认值的参数必须放在没有默认值的所有参数之后。“数组参数”这种必须放在所有参数(包括有默认值的这些)之后,而且数组本身不能有一个默认值。
3.默认值必须是编译时能确定的常量值。这些参数的类型可以是C#认定的基元类型。还包括枚举类型,以及能设计为null的任何引用类型。值类型的参数可将默认值设为值类型的实例,并让它的所有字段都包含零值。可以用default关键字或者new关键字来表达这个意思。
4.不要重命名参数变量,否则任何调用者以传参数名的方式传递实参,它们的代码也必须修改。
5.如果方法从模块外部调用,更改参数的默认值具有潜在的危险性。
6.如果参数用ref火或out关键字进行了标识,就不能设置默认值。因为没有办法为这些参数传递有意义的默认值。
//--
1.实参可按任意顺序传递,但命名实参只能出现实参列表的尾部。
2.可按名称将实参传递给没有默认值的参数,但所有必须的实参都必须传递(无论按位置还是按名称),编译器才能编译代码。
3.C#不允许省略逗号之间的实参。可以用传递参数名的方式传递实参即可。
4.如果参数要求ref/out,为了以传递参数名的方式传递实参,请使用下面的语法:
//--
在C#中,一旦为参数分配了默认值,编译器就会在内部向该参数应用定制特性System.Runtime.InteropServices.OptionalAttribute。该特性会在最终生成的文件元数据中持久地存储下来。此外,编译器向参数应用System.Runtime.InteropServices.DefaultParamenterValueAttribut特性,并将该属性持久性存储到生成的文件元数据中。然后,会向DefaultParamenterValueAttribut的构造器传递你在源代码中指定的常量值。
之后,一旦编译器发现某个方法调用确实了部分实参,就可以确定省略的是可选的实参,并从元数据中提取默认值,将值自动嵌入调用中。