[c#美味] c#4.0中的預設參數

來源:互聯網
上載者:User
文章目錄
  • 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(可選和具名引數)
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.