C#4.0新特性之二:Named and Optional Parameters (1)

來源:互聯網
上載者:User

這個特性比較簡單,依舊長話多說,只說重點。下面這個demo我們經常使用重載函數來處理問題的情境:

Code
 1 public void Process(int p1, float p2, string p3)
 2 {
 3     //todo 
 4 }
 5         
 6 public void Process(int p1, float p2)
 7 {
 8     Process(p1, p2, "fanweixiao");
 9 }
10         
11 public void Process(int p1)
12 {
13     Process(p1, 0f);
14 }

 

在C#4.0時代給我們提供了兩個新功能,具名引數(Named Parameters)和選擇性參數(Optional Parameters)。他們是兩個完全獨立的概念,只是經常一塊使用。改寫後的這個函數為:

Code
1 public int NBProcess(int p1=0, float p2=0f, string p3="fanweixiao")
2 {
3     //todo 
4 }

 

這樣我們就可以用NBProcess(10)來調用這個函數,相當於NBProcess(10, 0f, "fanweixiao")的調用。

如果想省去第二個參數我們可以這樣調用:NBProcess(10, p3:"FanWeixiao")。麻煩一點也可以寫成NBProcess(p1:10,p3:"FanWeixiao")。甚至還可以把參數改變順序NBProcess(p3:"FanWeixiao",p1:10)這樣來調用。

對於建構函式和indexer也可以這麼用。

對於有這樣的參數的重載,究竟如何判斷是調用哪個,邏輯也很簡單:最相近原則。(applicable)

從參數是5來看,首先排除了M(string,int),因為它要求第一個參數是string類型的。M(int, string)是可以的因為string是選擇性參數,它和M(int)都比M(object)要好,object是“萬惡之源”,比起object,5和int可是親切多了。那麼最後顯而易見M(int)是最好的。

建構函式不同型別參數的位置和個數是決定其區分的關鍵,而c#4.0的這個特性把參數的名字放入規則中了,以後給參數起名也得正經點了:)。其實像python這樣的動態語言,上面的功能都支援,還有一個更酷的“*參數”:

Code
1 def stepper(what, by=1):
2         what += by
3         return what

5 def average(first,  *rest):
6         sum = first
7          for value in rest: sum +=  value
8         result = 1.0 * sum / (len(rest) + 1)
9         return result

當然我們也可以用param關鍵字做到這一點,但是確實還沒有python那麼酷,but,這已經夠用了:)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.