我们来自五湖四海,不为别的,只因有共同的爱好,为中国互联网发展出一分力!

C# 4.0 中的默认参数

2012年01月18日09:22 阅读: 19811 次

标签: C#, VS2010, 默认参数, 技巧介绍

在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


分享到: 更多
蓝客门户
©2001-2017 中国蓝客联盟 版权所有.
关于蓝客联盟历史宗旨章程技术服务联系我们蓝客社区