C# 4.0 中的默认参数

小编辑 发布于 2010/06/12 12:23
阅读 1K+
收藏 1

在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

 

加载中
返回顶部
顶部