亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

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

2020-01-24 03:11:30
字體:
來源:轉載
供稿:網友

復制代碼 代碼如下:

/給三個整數從小到大排序并求和及其平均值
//其中,三個待求整數及其排序的結果由引用參數傳遞;其和由輸出參數傳遞;平均值由返回值返回。
//在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;類;數組;委托;接口...
存儲結構:棧中存地址;堆中放數據;
賦值方式:傳的是數據的地址。

形參:全稱為"形式參數"是在定義函數名和函數體的時候使用的參數,目的是用來接收調用該函數時傳入的參數.
實參:全稱為"實際參數"是在調用時傳遞個該函數的參數.

形參和實參的類型必須要一致,或者要符合隱含轉換規則,
當形參和實參不是指針類型時(即不是按引用傳遞,而是按值傳遞時),
在該函數運行時,形參和實參是不同的變量,
他們在內存中位于不同的位置,形參將實
參的內容復制一份,在該函數運行結束的時候形參被釋放,
而實參內容不會改變.

而如果函數的參數是指針類型變量(按引用傳遞),在調用該函數的過程
中,傳給函數的是實參的地址,在函數體內部使用的也是
實參的地址,即使用的就是實參本身.所以在函數體內部
可以改變實參的值.

按引用傳遞最大的用途是實現“操作符”重載!

ref參數與out參數的區別在于:ref參數在調用方法前必須幾經初始化。而out參數在調用方法前可以沒有初始化,他們都以引用傳遞方式傳遞

C++有了“引用傳遞”后,“形參的改變不影響實參”被判無效。因為傳遞給函數的并不是一個值,而是變量自身。在函數中定義的形參雖然還是局部變量,但卻是一個引用。雖然這個引用的作用域僅限于函數內部,但是由于它與實參就是同一回事,所以對它的操作完全等同于對實參的操作。比如你叫“黑旋風”去買魚,或者叫“鐵?!比ベI魚,去的都是同一個人。

C++為什么要有“引用傳遞”這回事?一種說法是只有引用才能達到操作符重載的目的,這個以后再談。但是,撇開這個不談,形參是不是引用,直接影響了程序執行的效率。前面提到過,函數調用時要用實參的值去初始化形參,初始化的過程包含了定義一個變量、然后給它賦一個值兩個過程,如果這個變量并不是內部變量,而是一個類對象,那么,定義一個類對象可能很復雜,而初始化這個對象一樣會很復雜。而引用只是給對象取一個別名,不涉及定義與初始化,離開作用域時也不用釋放。

相比之下,用指針傳遞可以避免類對象的定義、初始化與釋放。只需要付出指針變量的定義、初始化與釋放的代價。但是,指針的殺傷力太大。即使是熟練的程序員,也不能保證絕不出現“野指針”,野針的代價幾乎無一例外是程序崩潰。

引用也不是吃素的,如果說指針傳遞是“幫你配了一把我家的鑰匙”,那么引用傳遞就是直接把我家的財產都交給了你。有時,我們使用引用傳遞僅僅是為了效率,而不希望實參被修改,那就要記得把形參標記為const,如“UINT GetLength(const CString&)”。

順便說一句,指針傳遞也可以這樣做。把形參定義為指向const對象的指針(而不是const指針),可以降低殺傷力,保護實參所對應的內存。如果是普通的值傳遞,那么有沒有const對函數外部并不影響。但是,我個人認為,有時候加上const也是一件好事。如果程序的邏輯并不需要改變參數,而實際上誤寫了代碼,加上const可以讓編譯器幫我們找出BUG。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
狠狠躁夜夜躁人人爽天天天天97| 欧美裸体男粗大视频在线观看| 欧美日韩国产va另类| 一本大道香蕉久在线播放29| 清纯唯美日韩制服另类| 国产精品久久久久久久久久免费| 日韩欧美亚洲综合| 亚洲欧美国产精品| 欧美一区二区.| 国产极品jizzhd欧美| 久久人人爽人人爽人人片亚洲| 亚洲香蕉伊综合在人在线视看| 91豆花精品一区| 国产欧美va欧美va香蕉在线| 欧美理论电影在线播放| 亚洲一区二区三区在线免费观看| 午夜精品一区二区三区在线播放| 亚洲综合中文字幕在线| 琪琪第一精品导航| 欧美www在线| 91久久久久久久一区二区| 最近2019中文字幕大全第二页| 色天天综合狠狠色| 亚洲高清久久网| 亚洲精品v天堂中文字幕| 91香蕉嫩草神马影院在线观看| 在线观看国产精品日韩av| 中文字幕精品—区二区| 亚洲自拍偷拍网址| 久久免费观看视频| 国产91精品视频在线观看| 国产亚洲精品久久久优势| 精品自在线视频| 亚洲国产中文字幕久久网| 久久亚洲国产精品成人av秋霞| 成人黄色短视频在线观看| 日韩在线观看免费av| 国产欧美最新羞羞视频在线观看| 日韩精品一区二区三区第95| 美女扒开尿口让男人操亚洲视频网站| 国产主播在线一区| 色妞久久福利网| 国产精品第一区| 国精产品一区一区三区有限在线| 91av在线国产| 日产精品久久久一区二区福利| 国产精品激情自拍| 色偷偷噜噜噜亚洲男人| 中文字幕精品av| 国语自产精品视频在线看抢先版图片| 国产欧美精品一区二区三区-老狼| 日韩精品黄色网| 久热精品视频在线观看一区| 美女精品视频一区| 4388成人网| 亚洲精品一区二区在线| 中文字幕免费国产精品| 欧美激情视频一区二区| 国产mv久久久| 国产精品pans私拍| 亚洲www永久成人夜色| 国产91精品久久久久| 日韩二区三区在线| 国产精品jvid在线观看蜜臀| 人人澡人人澡人人看欧美| 亚洲日本欧美中文幕| 国产精品96久久久久久又黄又硬| 亚洲free性xxxx护士hd| 欧美日韩性视频在线| 亚洲国产精品99久久| 国产日韩欧美一二三区| 88国产精品欧美一区二区三区| 欧美成人合集magnet| 欧美日韩国产色视频| 国产a∨精品一区二区三区不卡| 日韩在线免费视频观看| 久久五月天综合| 国产欧美久久久久久| 日韩av网站电影| 91chinesevideo永久地址| 亚洲一区二区少妇| 欧美日韩国产精品一区二区三区四区| 日韩电影免费在线观看中文字幕| 欧美—级a级欧美特级ar全黄| 久久久影视精品| 国产丝袜一区视频在线观看| 日韩精品在线观看一区| 狠狠久久五月精品中文字幕| 免费99精品国产自在在线| 欧美精品www在线观看| 51精品国产黑色丝袜高跟鞋| www欧美日韩| 亚洲一区二区三区成人在线视频精品| 国产美女高潮久久白浆| 在线日韩av观看| 欧美成人黄色小视频| 国产精品va在线播放我和闺蜜| 日韩精品久久久久| 亚洲欧美日韩中文视频| 97久久精品人人澡人人爽缅北| 4438全国亚洲精品在线观看视频| 亚洲免费伊人电影在线观看av| 欧美激情国产日韩精品一区18| 欧美精品国产精品日韩精品| 国产伊人精品在线| 欧洲亚洲在线视频| 中文字幕亚洲色图| 国产一区二区三区高清在线观看| 日韩av中文字幕在线免费观看| 久久精品国产96久久久香蕉| 亚洲偷欧美偷国内偷| 国产一区红桃视频| 69av在线视频| 美女少妇精品视频| www欧美xxxx| 欧美黑人巨大精品一区二区| 日韩精品丝袜在线| 久久99精品久久久久久琪琪| 欧美激情久久久久久| 国产日韩欧美夫妻视频在线观看| 精品国产拍在线观看| 国产精品成人一区二区三区吃奶| 欧美精品videos性欧美| 91视频免费在线| 欧美做爰性生交视频| 国产精品亚洲片夜色在线| 操91在线视频| 国产精品揄拍500视频| 亚洲精品福利视频| 国产精品亚洲第一区| 欧美国产日韩二区| 亚洲欧洲在线看| 国产精品偷伦免费视频观看的| 在线看欧美日韩| 日韩精品视频在线| 欧美亚洲第一区| 精品动漫一区二区| 97碰在线观看| 亚洲精选一区二区| 久久久久久亚洲精品| 欧美日韩综合视频| 日本精品免费观看| 亚洲性线免费观看视频成熟| 日韩中文第一页| 538国产精品视频一区二区| 欧美大片网站在线观看| 国产一区二区日韩| 久久久久久久久久av| 精品视频久久久久久久| 91av在线网站| 91久久久久久久久久| 亚洲三级av在线| 成人午夜激情免费视频| 色综合色综合久久综合频道88| 亚洲区在线播放| 久久综合免费视频影院| 日韩免费观看av| 久久99精品国产99久久6尤物| 亚洲国产成人精品电影| 欧美激情亚洲激情| 欧美国产日韩一区| 国产欧美日韩视频| 欧美日韩成人黄色| 欧美日韩国产一区二区三区|