文章目錄
- Before c# 4.0
- After 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(可選和具名引數)