萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> C#中按引用傳遞與按值傳遞的區別,以及ref與out關鍵字的用法詳解

C#中按引用傳遞與按值傳遞的區別,以及ref與out關鍵字的用法詳解

以下是對C#中按引用傳遞與按值傳遞的區別,以及ref與out關鍵字的用法進行了詳細的分析介紹,需要的朋友可以過來參考下   復制代碼 代碼如下:
/給三個整數從小到大排序並求和及其平均值
//其中,三個待求整數及其排序的結果由引用參數傳遞;其和由輸出參數傳遞;平均值由返回值返回。
//在Main()方法中實現三個待求整數的輸入及結果的輸出
//目的:定義方法;調用方法;;理解形參和實參的引用傳遞關系;熟悉引用參數和輸出參數的使用。
using System;
class Class1
 {
   //x,y,z是形參,按值傳遞
   static void Sort(int x, int y, int z)
    {
      int temp=0;
      if(x>y)
       {
         temp=x;
         x=y;
         y=temp;
       }
      if(y>z)
       {
         temp=z;
         z=y;
         if(x>temp)
          {
            y=x;
            x=temp;
          }
         else
          {
            y=temp;
          }
       }
       Console.WriteLine("The sorted list is {0},{1},{2}",x,y,z);
       x=x+y+z;
    }

   //i,j,k,total是形參,按引用傳遞(ref參數,out參數,都是按引用傳遞的方式)
   static double Average(ref int i, ref int j, ref int k, out int total)
    {
      double l = 0;
      total = i+j+k;
      i=total;
      l=(double)(total/3.0);
      return l;
    }

   static void Main()
    {
      //a,b,c是實參,將要賦值給形參i,j,k,total;
      int a, b, c;

      //聲明out參數result,可以不用初始化它
      int result;

      Console.Write("Please enter the first number a =");
      a = Convert.ToInt32(Console.ReadLine());
      Console.Write("Please enter the second number b =");
      b = Convert.ToInt32(Console.ReadLine());
      Console.Write("Please enter the third number c =");
      c = Convert.ToInt32(Console.ReadLine());     

      Sort(a,b,c);

      //Sort(int x, int y, int z)函數中,形參x,y,z是按值傳遞的,所以即使函數中有x=x+y+z;函數      //執行後實參a值不變。
      Console.WriteLine("The original value of /"a/" is {0}, it hadn't been changed in spite "+"of manipulating the Sort() method, because it is transmitted by a Value para /"x/"!",a);

      //Average(ref int i, ref int j, ref int k, out int total)函數中,形參a,b,c,result都是        //按引用傳遞的,執行後實參a值改變。
      Console.WriteLine("The average result is {0}",Average(ref a,ref b,ref c, out result));
      //ref參數在調用方法前必須幾經初始化。
      //而out參數在調用方法前可以沒有初始化,他們都以引用傳遞方式傳遞

      Console.WriteLine("The value of /"a/" has been changed due to the Average() method"    +" is manipulated, and it is transmitted by a ref para /"ref i/"! now it is {0}!",a);

      Console.ReadLine();
    }
 }


問題與解答:

1,值傳遞時,為什麼被調用的方法中的形參值的改變不會影響到相應的實參?
答:因為按值傳遞時,系統首先為被調用的方法的形參分配內存空間,然後把實參中的值按位置一一對應“復制”給形參。形參中存儲的值只是一份實參的拷貝,因此被調用方法中形參值的任何改變都不會影響到相應的形參。

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

3,什麼是形參,什麼是實參?
答:
形參:
在定義函數中指定的參數就是形參,在未出現函數調用時,他們並不占內存中的存儲單元,只有在發生函數調用時,函數中的形參才被分配內存單元。在調用結束後,形參所占的內存單元也被釋放。

實參:實參可以是常量、變量和表達式,但要求有確定的值。在調用時將實參的值賦給形參。在內存中,實參單元和形參單元是不同的單元。在調用函數時,給形參分配存儲單元,並將實參對應的值傳遞給形參,調用結束後,形參單元被釋放,實參單元仍保留原值。

理解:
實參就是送進去方法中的東西~~行參就是把送進來的東西在方法中進行拷貝加工,加工完後方法就返回一個東西--返回值。

值傳遞的時候,實參是不變的~形參是隨著計算而變化的~~
指針/引用傳遞的時候~~行參怎麼變~實參就怎麼變.... 

參數的傳遞分為:1.值方式參數傳遞,2.引用方式參數傳遞。
1)按值傳遞(不能改變實參)
實參是變量,表達式等數值。

函數調用的時候,實參和形參存在於內存中2快不同的區域,實參先自己復制一份拷貝,再把拷貝傳給形參。由於是傳遞的是拷貝,所以實參不會受形參的影響,實參值不會被改變。

2)按地址傳遞(可以改變實參)
實參是指針/引用。

函數調用的時候,指針傳給你,形參和實參指針都一樣,對形參的任何操作就等於對實參的操做。實參的值就可以被改變。

對參數的影響:
2種數據類型:值類型+引用類型
2種傳參方式:值傳參+引用傳參(ref與out關鍵字);

以上的四種參數的組合 除了值傳參方式傳遞值類型數據,其他的組合方式對參數的操作都會影響參數,都會改變!

值類型:簡單類型(int,float,double,long,char,bool)+結構+枚舉
存儲結構:數據存放在棧中(棧:先進後出;單入口,單出口);效率高
賦值方式:傳的是值

引用類型:除去簡單類型(int,float,double)+結構+枚舉以外的類型都是引用數據類型。如string;object;類;數組;委托;接口...
存儲結構:棧中存地址;堆中放數據;
賦值方式:傳的是數據的地址。

copyright © 萬盛學電腦網 all rights reserved