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


以值傳遞參數

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

 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.引用方式參數傳遞。


免責聲明!

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



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