這個(gè)特性比較簡(jiǎn)單,依舊長(zhǎng)話多說,只說重點(diǎn)。下面這個(gè)demo我們經(jīng)常使用重載函數(shù)來處理問題的場(chǎng)景:
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時(shí)代給我們提供了兩個(gè)新功能,命名參數(shù)(Named Parameters)和可選參數(shù)(Optional Parameters)。他們是兩個(gè)完全獨(dú)立的概念,只是經(jīng)常一塊使用。改寫后的這個(gè)函數(shù)為:
Code
1 public int NBProcess(int p1=0, float p2=0f, string p3="fanweixiao")
2 {
3 //todo
4 }
這樣我們就可以用NBProcess(10)來調(diào)用這個(gè)函數(shù),相當(dāng)于NBProcess(10, 0f, "fanweixiao")的調(diào)用。
如果想省去第二個(gè)參數(shù)我們可以這樣調(diào)用:NBProcess(10, p3:"FanWeixiao")。麻煩一點(diǎn)也可以寫成NBProcess(p1:10,p3:"FanWeixiao")。甚至還可以把參數(shù)改變順序NBProcess(p3:"FanWeixiao",p1:10)這樣來調(diào)用。
對(duì)于構(gòu)造函數(shù)和indexer也可以這么用。
對(duì)于有這樣的參數(shù)的重載,究竟如何判斷是調(diào)用哪個(gè),邏輯也很簡(jiǎn)單:最相近原則。(applicable)
從參數(shù)是5來看,首先排除了M(string,int),因?yàn)樗蟮谝粋€(gè)參數(shù)是string類型的。M(int, string)是可以的因?yàn)閟tring是可選參數(shù),它和M(int)都比M(object)要好,object是“萬惡之源”,比起object,5和int可是親切多了。那么最后顯而易見M(int)是的。
構(gòu)造函數(shù)不同類型參數(shù)的位置和個(gè)數(shù)是決定其區(qū)分的關(guān)鍵,而c#4.0的這個(gè)特性把參數(shù)的名字放入規(guī)則中了,以后給參數(shù)起名也得正經(jīng)點(diǎn)了:)。其實(shí)像python這樣的動(dòng)態(tài)語言,上面的功能都支持,還有一個(gè)更酷的“*參數(shù)”:
Code
1 def stepper(what, by=1):
2 what += by
3 return what
4
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
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時(shí)代給我們提供了兩個(gè)新功能,命名參數(shù)(Named Parameters)和可選參數(shù)(Optional Parameters)。他們是兩個(gè)完全獨(dú)立的概念,只是經(jīng)常一塊使用。改寫后的這個(gè)函數(shù)為:
Code
1 public int NBProcess(int p1=0, float p2=0f, string p3="fanweixiao")
2 {
3 //todo
4 }
這樣我們就可以用NBProcess(10)來調(diào)用這個(gè)函數(shù),相當(dāng)于NBProcess(10, 0f, "fanweixiao")的調(diào)用。
如果想省去第二個(gè)參數(shù)我們可以這樣調(diào)用:NBProcess(10, p3:"FanWeixiao")。麻煩一點(diǎn)也可以寫成NBProcess(p1:10,p3:"FanWeixiao")。甚至還可以把參數(shù)改變順序NBProcess(p3:"FanWeixiao",p1:10)這樣來調(diào)用。
對(duì)于構(gòu)造函數(shù)和indexer也可以這么用。
對(duì)于有這樣的參數(shù)的重載,究竟如何判斷是調(diào)用哪個(gè),邏輯也很簡(jiǎn)單:最相近原則。(applicable)
從參數(shù)是5來看,首先排除了M(string,int),因?yàn)樗蟮谝粋€(gè)參數(shù)是string類型的。M(int, string)是可以的因?yàn)閟tring是可選參數(shù),它和M(int)都比M(object)要好,object是“萬惡之源”,比起object,5和int可是親切多了。那么最后顯而易見M(int)是的。
構(gòu)造函數(shù)不同類型參數(shù)的位置和個(gè)數(shù)是決定其區(qū)分的關(guān)鍵,而c#4.0的這個(gè)特性把參數(shù)的名字放入規(guī)則中了,以后給參數(shù)起名也得正經(jīng)點(diǎn)了:)。其實(shí)像python這樣的動(dòng)態(tài)語言,上面的功能都支持,還有一個(gè)更酷的“*參數(shù)”:
Code
1 def stepper(what, by=1):
2 what += by
3 return what
4
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