1. 程式人生 > >c#中可變引數params關鍵字學習

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