2.内部实现
ILDASM反编译一下Test.OptionalAndNamedParams,代码段为:
.method public hidebysig instance void OptionalAndNamedParams(int32 a,
[opt] string b,
[opt] object c) cil managed
{
.param [2] = ""
.param [3] = "http://www.xianfen.net"
// ...
[opt] string b,
[opt] object c) cil managed
{
.param [2] = ""
.param [3] = "http://www.xianfen.net"
// ...
可选参数前声明为OptionalAttribute特性。这是C#4.0的语法糖。
Test.OptionalAndNamedParams方法等价的代码为:
public void OptionalAndNamedParams(int a,
[Optional, DefaultParameterValue("")] string b,
[Optional, DefaultParameterValue("http://www.xianfen.net")] object c)
{
Console.WriteLine("a:{0}, b:{1}, c:{2}", a, b, c);
}
[Optional, DefaultParameterValue("")] string b,
[Optional, DefaultParameterValue("http://www.xianfen.net")] object c)
{
Console.WriteLine("a:{0}, b:{1}, c:{2}", a, b, c);
}
如果不用DefaultParameterValueAttribute特性设置默认值,则输出为:

现在知道了Office开发中Missing的原因了。
OptionalAttribute和DefaultParameterValueAttribute不是FCL的新类,他们把方法的参数声明为可选方法和指定默认值,以便被支持可选参数和默认参数的语言调用(如VB、VC++等)。