C#中值傳遞與引用傳遞的區別

來源:互聯網
上載者:User

標籤:

以值傳遞參數

當實參當作值來傳遞時,就產生了一個新的拷貝。

 class Test     {  

     static void Main(string[] args)         {      

              int x=8;            

                Fo(x);  

            Console.WriteLine("x={0}", x);  

       }  

         static void Fo(int p)  

       { 

           p = p + 1;  

           Console.WriteLine("p={0}", p);  

       }  

   }    程式運行結果為:p=9,x=8;即X的值不會受P影響,給P賦一個新值並不會改變X的內容,因為P和X存在於記憶體中不同的位置。

 

同理,用傳值的方式傳遞一個參考型別對象時,只是複製這個對象本身,即複製其地址值,而不是它指代的對象。下面代碼中Fo中看到的StringBuilder對象,就是在Main方法中執行個體化的那一個,只是有不同的引用指向它而已。  static void Fo(StringBuilder foSB)  

{       

      foSB.Append("test");  

      foSB = null;  

}  

static void Main()  

{  

StringBuilder sb = new StringBuilder();  

Fo(sb);  

Console.WriteLine(sb.ToString());  

}    運行結果:test.

換句話說,sb和foSB是指向同一對象的不同引用變數。因為foSB是引用的拷貝,把它置為null並沒有把sb置為 null.

 

ref修飾符

當使用rel關鍵字時,表示是用引用的方式傳遞參數。實參和形參引用的都是同一個對象,改變其中一個的引用值,另一個也會改變。  

 

static void Main(string[] args)  

{  

           int x = 8;  

           Fo(ref x);  

           Console.WriteLine("x={0}", x);  

}  

 

static void Fo(ref int p)  

{  

            

           p = p + 1;  

           Console.WriteLine("p={0}", p);  

}    運行結果:P=9;X=9  。  

如果在函數FO中改變P的值,則X的值也會隨之改變。  static void Main(string[] args)  

{  

            int x = 8;  

            Fo(ref x);  

            Console.WriteLine("x={0}", x);  

}  

  

static void Fo(ref int p)  

{  

            p = 10;  

            p = p + 1;  

            Console.WriteLine("p={0}", p);  

}  運行結果:P=11,X=11;

ref修飾符在寫函數和調用函數時都一定要出現。

ref修飾符主要應該於實現交換的方法中。  static void Swap(ref string a, ref string b)  

{  

            string temp = a;  

            a = b;  

            b = temp;  

}  

static void Main()  

{  

            string x = "Hello";  

            string y = "World";  

            Swap(ref x, ref y);  

            Console .WriteLine (x);  

            Console.WriteLine(y);  

}   運行結果:World Hello

 

out修飾符

out修飾符與ref修飾符非常相似,除了以下兩點為:

一,在調用函數時不需要賦值。

二,在函數退出前必須賦值。

out修飾符通常用於需要從方法中擷取多個傳回值的時候  static void Split(string name, out string firstName, out string lastName)  

{  

            int i=name .LastIndexOf (‘ ‘);  

            firstName =name .Substring (0,i);  

            lastName =name .Substring (i+1);  

}  

static void Main()  

{  

            string name = "Steven Francis";  

            string a, b;  

            Split(name, out a, out b);  

            Console .WriteLine (a);  

            Console .WriteLine (b);  

}    運行結果:a=Steven,b=Francis  總結:  1,值傳遞時,為什麼被調用的方法中的形參值的改變不會影響到相應的實參?

答:因為按值傳遞時,系統首先為被調用的方法的形參分配記憶體空間,然後把實參中的值按位置一一對應“複製”給形參。形參中儲存的值只是一份實參的拷貝,因此被呼叫者法中形參值的任何改變都不會影響到相應的形參。

  2,值傳遞和引用傳遞有什麼不同,什麼是值參數,它以什麼方式傳遞? 答:值 傳遞時,系統首先為被呼叫者法的形參分配記憶體空間,並將實參的值按位置一一對應地複製給形參,此後,被呼叫者法中形參值得任何改變都不會影響到相應的實 參; 而引用傳遞時,系統不是將實參本身的值複製後傳遞給形參,而是將其引用值(即地址值)傳遞給形參,因此,形參所引用的該地址上的變數與傳遞的實參相同,方 法體內相應形參值得任何改變都將影響到作為引用傳遞的實參。

  3,什麼是形參,什麼是實參? 答: 形參:在定義函數中指定的參數就是形參,在未出現函數調用時,他們並不佔記憶體中的儲存單元,只有在發生函數調用時,函數中的形參才被分配記憶體單元。在調用結束後,形參所佔的記憶體單元也被釋放。
實參:實參可以是常量、變數和運算式,但要求有確定的值。在調用時將實參的值賦給形參。在記憶體中,實參單元和形參單元是不同的單元。在調用函數時,給形參分配儲存單元,並將實參對應的值傳遞給形參,調用結束後,形參單元被釋放,實參單元仍保留原值。
理解: 實參就是送進去方法中的東西~~行參就是把送進來的東西在方法中進行拷貝加工,加工完後方法就返回一個東西--傳回值。

  值傳遞的時候,實參是不變的~形參是隨著計算而變化的~~ 引用傳遞的時候~~行參怎麼變~實參就怎麼變.... 
參數的傳遞分為:1.值方式參數傳遞,2.引用方式參數傳遞。

C#中值傳遞與引用傳遞的區別

相關文章

聯繫我們

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