[C# 4.0] 4. Named & Optional Parameters

[ 2009-11-12 14:43:44 | 作者: yuhen ]
字号: | |
这东西不是啥新鲜玩意,N 多语言支持,尤其是动态语言中应用最为灵活。不过我倒是很期待这玩意,每次写类库搞一大堆方法重载都很郁闷。
static void Test(string s, int x = 123, double y = 45.3d)
{
    Console.WriteLine("{0},{1},{2}", s, x, y);
}

static void Main(string[] args)
{
    Test("a");
    Test("a", y: 99d);
    Test("a", y: 99d, x: 88);
    Test(y: 99d, x: 88, s: "a");
}
  • 可选参数: 在方法声明中直接写入默认值,调用方法时可忽略。可选参数必须放在最后,否则将引发 "Optional parameters must appear after all required parameters" 编译错误。
  • 命名参数: 方法调用时可提供参数名称,如此便可自由安排参数顺序。
看看反编译的结果。
private static void Test(string s, 
    [Optional, DefaultParameterValue(0x7b)] int x, 
    [Optional, DefaultParameterValue(45.3)] double y)
{
    Console.WriteLine("{0},{1},{2}", s, x, y);
}

private static void Main(string[] args)
{
    Test("a", 0x7b, 45.3);
    Test("a", 0x7b, 99.0);
    Test("a", 0x58, 99.0);
    Test("a", 0x58, 99.0);
}

编译器为可选参数增加了 OptionalAttribute 和 DefaultParameterValueAttribute 特性,以便于引用编译和反射调用时能获取默认值。至于命名参数,无非是变相告知参数键值而已,最终编译结果还是按照原有的规则和顺序生成方法调用。

语言的进化,是相互借鉴的结果…… 更多的是懒人的功劳…… [sweat]
[最后修改由 yuhen, 于 2009-11-14 01:48:35]
评论Feed 评论Feed: http://www.rainsts.net/feed.asp?q=comment&id=879

这篇日志没有评论。

发表评论
表情图标
[smile] [confused] [cool] [cry]
[eek] [angry] [wink] [sweat]
[lol] [stun] [razz] [redface]
[rolleyes] [sad] [yes] [no]
[heart] [star] [music] [idea]
UBB代码
转换链接
表情图标
悄悄话
用户名:   密码:  
验证码 * 请输入验证码