[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); }
执行后如图:
注意:带默认值的参数必须放到参数列表最后面,即不能用如下的方法,否则编译不过
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); }
编译失败:
背后的故事
这么方便的功能,那微软到底做了啥呢?用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命名空间下:
- OptionalAttribute:表示这个参数是可选的。
- DefaultParameterValueAttribute:这个属性设置参数的默认值。
有资料说:根据这个原理,前面提到可选参数必须放后面的代码可以自己指定这两个属性,这样编译就没问题了。但是我亲自实践不可以,调用时还是会报错。
怎么解决呢?下篇文章告诉你。
参考资料:
- New features in C# 4.0.doc
- C# 4.0 - Named and Optional Parameters - Behind the Scenes
- C# 4.0 特性: Named & Optional Parameters(可选和命名参数)
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名和链接(http://greenerycn.cnblogs.com).
如果觉得文章有用,愿意的话赞助一杯饮料吧,谢谢。