[c#美味] c#4.0中的默认参数

在C#4.0中,对于我来说,首先吸引我的就是默认参数这个特性。当我在Python中非常流畅的使用这个特性时,C#却只能写大量的重载函数,然后一个调一个,最终调用的是参数最多的那一个。

Before c# 4.0

在4.0之前,我要一个函数的参数有默认值时,就必须要这样写:

static void OldFun(string param1)
{
    OldFun(param1, "default param2");
}

static void OldFun(string param1, string param2)
{
    OldFun(param1, param2, "default param3");
}

static void OldFun(string param1, string param2, string param3)
{
    var content = string.Format("{0},{1},{2}",param1,param2,param3);
    Console.WriteLine(content);
}

真折磨人,想不明白为啥微软就不提供一个默认参数呢,这点上我都羡慕C++程序员.

After 4.0

“千呼万唤始出来”,在c# 4.0中微软终于增加了这个功能。

新的代码如下,简洁多了。

static void Main(string[] args)
{
    OldFun("GreenerycnDemo"); 
    OldFun("GreenerycnDemo", "abc"); 
    OldFun("greenerycn", "cnblogs", "com");
}

static void OldFun( string param1, 
                    string param2 = "default param2", 
                    string param3 = "default param3")
{
    var content = string.Format("{0},{1},{2}", param1, param2, param3);
    Console.WriteLine(content);
}

执行后如图:

optionalParameter

 

注意:带默认值的参数必须放到参数列表最后面,即不能用如下的方法,否则编译不过

static void OldFun(string param2 = "default param2", 
                   string param1, 
                   string param3 = "default param3")
{
    var content = string.Format("{0},{1},{2}",param1,param2,param3);
    Console.WriteLine(content);
}

编译失败:

optionalParameterMustAfterAllRequiredParameters

背后的故事

这么方便的功能,那微软到底做了啥呢?用Reflector看一下:

private static void OldFun(string param1, 
    [Optional, DefaultParameterValue("default param2")] string param2, 
    [Optional, DefaultParameterValue("default param3")] string param3)
{
    Console.WriteLine(string.Format("{0},{1},{2}", param1, param2, param3));
}

哈哈,原来就是在参数签名加了Optional和DefaultParameterValue两个属性啊。

这两个属性在System.Runtime.InteropServices命名空间下:

资料说:根据这个原理,前面提到可选参数必须放后面的代码可以自己指定这两个属性,这样编译就没问题了。但是我亲自实践不可以,调用时还是会报错。

invalidCall

 

怎么解决呢?下篇文章告诉你。

 

参考资料:

posted @ 2010-05-20 00:34  林杰的博客  阅读(3109)  评论(0编辑  收藏  举报