c# 方法參數(傳值,傳引用,ref,out,params,可選參數,命名參數)


 
  

 一、方法參數的類型----值類型和引用類型

       當方法傳遞的參數是值類型時,變量的棧數據會完整地復制到目標參數中即實參和形參中的數據相同但存放在內存的不同位置。所以,在目標方法中對形參所做的更改不會對調用者的初始變量產生任何影響。

      當方法傳遞的參數是引用類型是,只是將變量的引用復制到目標參數中,實參和形參的引用指向內存中的同一位置。所以,在目標方法中對形參所做的更改會影響調用者的初始變量。

二、一些特殊的方法參數

1、引用參數---ref (使值類型的變量做方法參數時也可以傳引用)

    一些數據類型(例如類,數組等引用類型)作為方法的參數時默認是傳引用的,大多數數據類型(例如結構,整數類型等值類型)在作為方法的參數時是傳值的。那么,如何使值類型的數據作為方法參數時傳遞的也是引用呢?

     方法很簡單,只需要在形參的數據類型前加上關鍵字ref,並在調用時相應地實參前也加上關鍵字ref即可。

   例如:  void  Swap( ref String first, ref String second)   {   .......}

               String a="dddd",b="dbbb";

               Swap(ref a,ref b); 注意:ref參數必須是可以賦值的變量

2、輸出參數---out

      除了將參數單向傳入一個方法(傳值),或同時將參數傳入和傳出一個方法(傳引用)之外,還可以將數據從一個方法內部單向傳出方法。為此,代碼需要使用關鍵字out來修飾參數類型。

     例如:  int x;   //

                  func(out x);     //out參數必須是可以賦值的變量,在調用func方法前對out參數賦不賦值都可以。

                void func(out int x ) {};// 在此方法中,在使用out參數x之前必須對其賦值,即使在調用此方法前已經對out參數x賦值了,在此方法中仍吧x看做未賦值的變量。

ref參數與out參數都是傳引用,在方法中對參數所做的修改都會傳到調用者。區別在於,out參數不接受調用者傳來參數的數據值,而是把該參數當做未賦值的參數。

 

 3、參數數組-----params(可以將相同類型,數量可變的多個參數傳給一個方法)

     引入:一般,參數的數量都是由目標方法聲明所確定。然而,有時我們希望參數的數量是可變的。或許最好的方法是為方法傳一個數組。然而,這會使調用代碼變得稍微復雜一些,因為需要事先構造一個數組,再將這個數組作為參數來傳遞。 為了簡化代碼,c#提供了一個特殊的關鍵字,它允許在調用一個方法是提供數量可變的參數,而不是由方法事先固定好參數的數量。

     示例:

  運行結果:

    示例說明:上述例子中方法func可接受數量可變的參數,不管這些參數是以逗號分隔的,還是作為一個數組來傳遞的。為了獲得這樣的效果,func方法需要:(1)在方法聲明的最后一個參數之前,添加一個parmas關鍵字。(2)將最后一個參數聲明為一個數組。

   注意事項:

 @1、參數數組不一定是方法聲明中的唯一參數。單數必須是最后一個參數。由於只有最后一個參數才可能是參數數組,所以方法最多只能有一個參數數組。

 @2、調用者可以為參數數組指定0個參數,這會造成包含0個數據項的一個數組。也可以顯示地使用一個數組,而不是以逗號分隔的參數列表,最終生成的CIL代碼是一樣的。

 @3、參數數組是類型安全的------類型必須匹配與數組指定的類型。

 @4、假如目標方法的實現要求一個最起碼的參數數量,請在方法聲明中顯示指定必須提供的參數。這樣一來,假如要求的參數遺失了,就會導致編譯器報錯,而不需要依賴於運行時錯誤處理。例如:使用int max (int first,params int[] operands)而不是int max(params int[] operands),確保至少有一個值傳給方法max。

4、可選參數:

    從c#4.0開始,增添了對可選參數的支持。聲明方法是將常量賦給參數,以后調用方法是就不必每一個參數都指定,若不指定該參數則該參數為方法聲明時指定的初始值。

  例如:

      void  func(int x, int y=2) { Console.WrinteLine(x+y);}

      func(3,2) 和func(3)的輸出結果是相同的。

  注意:

  @1、可選參數一定放在所有必須的參數(沒有默認值的參數)后面。可選參數的數量可以是多個。

  @2、默認值必須是一個常量,或者說必須是編譯時能確定的一個值。

 5、命名參數

   命名參數是c#4.0新增的一個方法調用功能。利用命名參數,調用者可顯示指定參數名,並為該參數賦一個值而不是像以前那樣只能依據參數順序來決定哪個值賦給哪個參數。

 例如: void  func(int x, int y=2) { Console.WrinteLine(x+y);}     func(y:3,x:2);

               void  display(string firstname, string middlename=default(string), string lastname =default(string));      display(firstname:"susan",lastname: "lili");

注意:如果一個方法有大量參數,而且其中許多都是可選參數(訪問Microsoft COM庫時,這是很常見的情況),那么命名參數語法肯定能帶來不少便利。但這個便利的代價是犧牲方法接口的靈活性。過去,參數名可以自由更改,不會造成調用代碼無法編譯。但在添加了命名參數后,參數名就成為方法接口的一部分。更改名稱會導致使用命名參數的代碼無法編譯。

6、方法解析(即當同一個方法調用可以適用多個方法,將調用哪個方法)

    當同時使用參數數組,可選參數,命名參數,方法重載等功能時,可能造成同一個方法調用可以適用多個方法。

(1)假如由於一個方法有一個可選參數,造成兩個方法都適用(方法重載時可能出現),編譯器最終選擇的將使無可選參數的方法。

(2)假如有兩個適用的方法,每個都需要(對參數)執行一次隱式轉換,就選擇與更具體的類型匹配的方法。例如,如果調用者傳遞的是一個int,那么接受double的方法將優先於接受object的方法。這是由於double比object更具體。

(3)如果有多個適用的方法,但無法從中挑選一個最具唯一性的,編譯器就會報錯,指明調用存在歧義。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM