c#中可變引數params關鍵字學習
引用 https://www.cnblogs.com/maowp/p/8134342.html
基礎知識
1、概念
params 是C#開發語言中關鍵字, params主要的用處是在給函式傳引數的時候用,就是當函式的引數不固定的時候。 在方法宣告中的 params 關鍵字之後不允許任何其他引數,並且在方法宣告中只允許一個 params 關鍵字。
2、注意項
1、若形參表中含一個引數陣列,則該引數陣列必須位於形參列表的最後。
2、不允許將params修飾符與ref和out修飾符組合起來使用。
3、引數陣列必須是一維陣列。
4、與引數陣列對應的實參可以是同一型別的陣列名,也可以是任意多個與該陣列的元素屬於同一型別的變數。
5、若實參是陣列則按引用傳遞,若實參是變數或表示式則按值傳遞。
https://www.cnblogs.com/facingwaller/archive/2010/12/28/advance_in_csharp_about_params.html
簡單例項
static Int32 Add(params Int32[] values) { // NOTE: it is possible to pass the 'values' // array to other methods if you want to.Int32 sum = 0; if (values != null) { for (Int32 x = 0; x < values.Length; x++) sum += values[x]; } return sum; } public static void Main() {var result1 = Add(1, 2, 3, 4, 5); var result2 = Add(1); var result3 = Add(1); }
原理和效能
public static void Main() { DisplayTypes(1, 3, 4); DisplayTypes(new Object[] { 1, 3, 4 }); Console.Read(); }
//編譯後
DisplayTypes(new object[] { (int) 1, (int) 3, (int) 4 }); DisplayTypes(new object[] { (int) 1, (int) 3, (int) 4 });
總之就是param就是提示編譯器實現對引數進行陣列封裝,將可變數目的控制由編譯器來完成。
效能
其實質其實構造一個 array 在編譯時確定其長度來 承載可變個數的引數.但效能上並不划算:因為需要額外構造一個array。
1在堆上分配記憶體
2初始化其元素
3最後還得被回收。
總結
1、 一般情況下不要用這種寫法。
2、 除非簡易型的需要,引數型別相同,只是個數可能是1個或多個(兩三個那種,逐個羅列),可以方便使用。如params guid[] customerIds,
需要給人發訊息時,接收人可能是1個或多個。
其實是一種正常傳陣列的偷懶寫法。傳陣列的寫法編譯時比較幹練,效能稍微好點。適用於1個或很多個人。因為不方便逐個羅列每個元素。
元素個數為三五個那種,用params寫起來方便,逐個羅列,如。如ReceiveMessage(“hello”,“張三”,”李四”,”王五”)
拓展學習
1引數和返回值儘量使用介面和基類
顯而易見,可以適用被更多種(派生)型別。
2、大牛博主撞破南牆有一系列的c#基礎進階部落格,可以拓展學習下。
https://www.cnblogs.com/facingwaller/archive/2010/12/28/advance_in_csharp_about_params.html