<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [你必須知道的.NET]第十二回:參數(shù)之惑---傳遞的藝術(shù)(下)

      發(fā)布日期:2007.7.6 作者:Anytao

      ?2007 Anytao.com ,原創(chuàng)作品,轉(zhuǎn)貼請注明作者和出處。

      本文將介紹以下內(nèi)容:

      • 按值傳遞與按引用傳遞深論
      • ref和out比較 
      • 參數(shù)應(yīng)用淺析 

       

      接上篇繼續(xù),『第十一回:參數(shù)之惑---傳遞的藝術(shù)(上)

      4.2 引用類型參數(shù)的按值傳遞

      當(dāng)傳遞的參數(shù)為引用類型時,傳遞和操作的是指向?qū)ο蟮囊茫@意味著方法操作可以改變原來的對象,但是值得思考的是該引用或者說指針本身還是按值傳遞的。因此,我們在此必須清楚的了解以下兩個最根本的問題:

      • 引用類型參數(shù)的按值傳遞和按引用傳遞的區(qū)別?
      • string類型作為特殊的引用類型,在按值傳遞時表現(xiàn)的特殊性又如何解釋?

      首先,我們從基本的理解入手來了解引用類型參數(shù)按值傳遞的本質(zhì)所在,簡單的說對象作為參數(shù)傳遞時,執(zhí)行的是對對象地址的拷貝,操作的是該拷貝地址。這在本質(zhì)上和值類型參數(shù)按值傳遞是相同的,都是按值傳遞。不同的是值類型的“值”為類型實例,而引用類型的“值”為引用地址。因此,如果參數(shù)為引用類型時,在調(diào)用方代碼中,可以改變引用的指向, 從而使得原對象的指向發(fā)生改變,如例所示: 

      引用類型參數(shù)的按值傳遞
      // FileName    : Anytao.net.My_Must_net
      // Description : The .NET what you should know of arguments. 
      // Release      : 2007/07/01 1.0

      // Copyright   : (C)2007 Anytao.com  http://www.anytao.com

      using System;

      namespace Anytao.net.My_Must_net
      {
          
      class Args
          {
              
      public static void Main()
              {
                  ArgsByRef abf 
      = new ArgsByRef();
                  AddRef(abf);
                  Console.WriteLine(abf.i);
              }

              
      private static void AddRef(ArgsByRef abf)
              {
                  abf.i 
      = 20;
                  Console.WriteLine(abf.i);
              }

          }

          
      class ArgsByRef
          {
              
      public int i = 10;
          }
      }


      因此,我們進一步可以總結(jié)為:按值傳遞的實質(zhì)的是傳遞值,不同的是這個值在值類型和引用類型的表現(xiàn)是不同的:參數(shù)為值類型時,“值”為實例本身,因此傳遞的是實例拷貝,不會對原來的實例產(chǎn)生影響;參數(shù)為引用類型時,“值”為對象引用,因此傳遞的是引用地址拷貝,會改變原來對象的引用指向,這是二者在統(tǒng)一概念上的表現(xiàn)區(qū)別,理解了本質(zhì)也就抓住了根源。關(guān)于值類型和引用類型的概念可以參考《第八回:品味類型---值類型與引用類型(上)-內(nèi)存有理》《第九回:品味類型---值類型與引用類型(中)-規(guī)則無邊》《第十回:品味類型---值類型與引用類型(下)-應(yīng)用征途》,相信可以通過對系列中的值類型與引用類型的3篇的理解,加深對參數(shù)傳遞之惑的昭雪。

      了解了引用類型參數(shù)按值傳遞的實質(zhì),我們有必要再引入另一個參數(shù)傳遞的概念,那就是:按引用傳遞,通常稱為引用參數(shù)。這二者的本質(zhì)區(qū)別可以小結(jié)為:

      • 引用類型參數(shù)的按值傳遞,傳遞的是參數(shù)本身的值,也就是上面提到的對象的引用;
      • 按引用傳遞,傳遞的不是參數(shù)本身的值,而是參數(shù)的地址。如果參數(shù)為值類型,則傳遞的是該值類型的地址;如果參數(shù)為引用類型,則傳遞的是對象引用的地址。

      關(guān)于引用參數(shù)的詳細概念,我們馬上就展開來討論,不過還是先分析一下string類型的特殊性,究竟特殊在哪里?

      關(guān)于string的討論,在本人拙作《第九回:品味類型---值類型與引用類型(中)-規(guī)則無邊》已經(jīng)有了討論,也就是開篇陳述的本文成文的歷史,所以在上述分析的基礎(chǔ)上,我認為應(yīng)該更能對第九回的問題,做以更正。

      string本身為引用類型,因此從本文的分析中可知,對于形如

      static void ShowInfo(string aStr){...}

      的傳遞形式,可以清楚的知道這是按值傳遞,也就是本文總結(jié)的引用類型參數(shù)的按值傳遞。因此,傳遞的是aStr對象的值,也就是aStr引用指針。接下來我們看看下面的示例來分析,為什么string類型在傳遞時表現(xiàn)出特殊性及其產(chǎn)生的原因?

      // FileName    : Anytao.net.My_Must_net
      // Description : The .NET what you should know of arguments. 
      // Release      : 2007/07/05 1.0

      // Copyright   : (C)2007 Anytao.com  http://www.anytao.com
      using System;

      namespace Anytao.net.My_Must_net
      {
          
      class how2str
          {
              
      static void Main()
              {
                  
      string str = "Old String";
                  ChangeStr(str);
                  Console.WriteLine(str);
              }

              
      static void ChangeStr(string aStr)
              {
                  aStr 
      = "Changing String";
                  Console.WriteLine(aStr);
              }
          }
      }

      下面對上述示例的執(zhí)行過程簡要分析一下:首先,string str = "Old String"產(chǎn)生了一個新的string對象,如圖表示:

       

      然后執(zhí)行ChangeStr(aStr),也就是進行引用類型參數(shù)的按值傳遞,我們強調(diào)說這里傳遞的是引用類型的引用值,也就是地址指針;然后調(diào)用ChangeStr方法,過程aStr = "Changing String"完成了以下的操作,先在新的一個地址生成一個string對象,該新對象的值為"Changing String",引用地址為0x06賦給參數(shù)aStr,因此會改變aStr的指向,但是并沒有改變原來方法外str的引用地址,執(zhí)行過程可以表示為:

       

      因此執(zhí)行結(jié)果就可想而知,我們從分析過程就可以發(fā)現(xiàn)string作為引用類型,在按值傳遞過程中和其他引用類型是一樣的。如果需要完成ChangeStr()調(diào)用后,改變原來str的值,就必須使用ref或者out修飾符,按照按引用傳遞的方式來進行就可以了,屆時aStr = "Changing String"改變的是str的引用,也就改變了str的指向,具體的分析希望大家通過接下來的按引用傳遞的揭密之后,可以自行分析。

      4.3 按引用傳遞之ref和out

      不管是值類型還是引用類型,按引用傳遞必須以ref或者out關(guān)鍵字來修飾,其規(guī)則是:

      • 方法定義和方法調(diào)用必須同時顯示的使用ref或者out,否則將導(dǎo)致編譯錯誤;
      • CRL允許通過out或者ref參數(shù)來重載方法,例如: 
      // FileName    : Anytao.net.My_Must_net
      // Description : The .NET what you should know of arguments. 
      // Release      : 2007/07/03 1.0

      // Copyright   : (C)2007 Anytao.com  http://www.anytao.com

      using System;
      namespace Anytao.net.My_Must_net._11_Args
      {
          
      class TestRefAndOut
          {
              
      static void ShowInfo(string str)
              {
                  Console.WriteLine(str);
              }
              
      static void ShowInfo(ref string str)
              {
                  Console.WriteLine(str);
              }
          }
      }

      當(dāng)然,按引用傳遞時,不管參數(shù)是值類型還是引用類型,在本質(zhì)上也是相同的,這就是:ref和out關(guān)鍵字將告訴編譯器,方法傳遞的是參數(shù)地址,而不是參數(shù)本身。理解了這一點也就抓住了按引用傳遞的本質(zhì),因此根據(jù)這一本質(zhì)結(jié)論我們可以得出以下更明白的說法,這就是:

      • 不管參數(shù)本身是值類型還是引用類型,按引用傳遞時,傳遞的是參數(shù)的地址,也就是實例的指針。
      • 如果參數(shù)是值類型,則按引用傳遞時,傳遞的是值類型變量的引用,因此在效果上類似于引用類型參數(shù)的按值傳遞方式,其實質(zhì)可以分析為:值類型的按引用傳遞方式,實現(xiàn)的是對值類型參數(shù)實例的直接操作,方法調(diào)用方為該實例分配內(nèi)存,而被調(diào)用方法操作該內(nèi)存,也就是值類型的地址;而引用類型參數(shù)的按值傳遞方式,實現(xiàn)的是對引用類型的“值”引用指針的操作。例如:  
      // FileName    : Anytao.net.My_Must_net
      // Description : The .NET what you should know of arguments. 
      // Release      : 2007/07/06 1.0

      // Copyright   : (C)2007 Anytao.com  http://www.anytao.com
      using System;

      namespace Anytao.net.My_Must_net
      {
          
      class TestArgs
          {
              
      static void Main(string[] args)
              {
                  
      int i = 100;
                  
      string str = "One";
                  ChangeByValue(
      ref i);
                  ChangeByRef(
      ref str);
                  Console.WriteLine(i);
                  Console.WriteLine(str);
              }

              
      static void ChangeByValue(ref int iVlaue)
              {
                  iVlaue 
      = 200;
              }

              
      static void ChangeByRef(ref string sValue)
              {
                  sValue 
      = "One more.";
              }
          }
      }

      如果參數(shù)是引用類型,則按引用傳遞時,傳遞的是引用的引用而不是引用本身,類似于指針的指針概念。示例只需將上述string傳遞示例中的ChangeStr加上ref修飾即可。 

      下面我們再進一步對ref和out的區(qū)別做以交代,就基本闡述清楚了按引用傳遞的精要所在,可以總結(jié)為:

      • 相同點:從CRL角度來說,ref和out都是指示編譯器傳遞實例指針,在表現(xiàn)行為上是相同的。最能證明的示例是,CRL允許通過ref和out來實現(xiàn)方法重載,但是又不允許通過區(qū)分ref和out來實現(xiàn)方法重載,因此從編譯角度來看,不管是ref還是out,編譯之后的代碼是完全相同的。例如:
      // FileName    : Anytao.net.My_Must_net
      // Description : The .NET what you should know of arguments. 
      // Release      : 2007/07/03 1.0

      // Copyright   : (C)2007 Anytao.com  http://www.anytao.com

      using System;
      namespace Anytao.net.My_Must_net._11_Args
      {
          
      class TestRefAndOut
          {
              
      static void ShowInfo(string str)
              {
                  Console.WriteLine(str);
              }
              
      static void ShowInfo(ref string str)
              {
                  Console.WriteLine(str);
              }
              
      static void ShowInfo(out string str)
              {
                  str 
      = "Hello, anytao.";
                  Console.WriteLine(str);
              }
          }
      }

      編譯器將提示: “ShowInfo”不能定義僅在 ref 和 out 上有差別的重載方法。 

      • 不同點:使用的機制不同。ref要求傳遞之前的參數(shù)必須首先顯示初始化,而out不需要。也就是說,使用ref的參數(shù)必須是一個實際的對象,而不能指向null;而使用out的參數(shù)可以接受指向null的對象,然后在調(diào)用方法內(nèi)部必須完成對象的實體化。  

      5. 結(jié)論

      完成了對值類型與引用類型的論述,在這些知識積累的基礎(chǔ)上,本文期望通過深入的論述來進一步的分享參數(shù)傳遞的藝術(shù),解開層層疑惑的面紗。從探討問題的角度來說,參數(shù)傳遞的種種誤區(qū)其實根植與對值類型和引用類型的本質(zhì)理解上,因此完成了對類型問題的探討再進入?yún)?shù)傳遞的迷宮,我們才會更加游刃有余。我想,這種探討問題的方式,也正是我們追逐問題的方式,深入進入.NET的高級殿堂是繞不開這一選擇的。

       

      參考文獻

      (USA)Jeffrey Richter, Applied Microsoft .NET Framework Programming

      (USA)David Chappell, Understanding .NET

       

      溫故知新

      [開篇有益]
      [第一回:恩怨情仇:is和as]
      [第二回:對抽象編程:接口和抽象類]
      [第三回:歷史糾葛:特性和屬性]
      [第四回:后來居上:class和struct]
      [第五回:深入淺出關(guān)鍵字---把new說透]
      [第六回:深入淺出關(guān)鍵字---base和this]
      [第七回:品味類型---從通用類型系統(tǒng)開始]
      [第八回:品味類型---值類型與引用類型(上)-內(nèi)存有理]
      [第九回:品味類型---值類型與引用類型(中)-規(guī)則無邊]
      [第十回:品味類型---值類型與引用類型(下)-應(yīng)用征途]
      [第十一回:參數(shù)之惑---傳遞的藝術(shù)(上)]

      ?2007 Anytao.com

      原創(chuàng)作品,轉(zhuǎn)貼請注明作者和出處,留此信息。

      本貼子以“現(xiàn)狀”提供且沒有任何擔(dān)保,同時也沒有授予任何權(quán)利。
      This posting is provided "AS IS" with no warranties, and confers no rights.

      posted @ 2007-07-06 16:12  Anytao  閱讀(11118)  評論(42)    收藏  舉報
      主站蜘蛛池模板: 中文国产成人精品久久不卡| 午夜免费国产体验区免费的 | 久久99九九精品久久久久蜜桃 | 亚洲精品乱码久久久久久按摩高清| 体态丰腴的微胖熟女的特征| 在线精品自拍亚洲第一区| 欧美激情一区二区久久久| 忘忧草在线社区www中国中文 | 一本久道中文无码字幕av| 国产免费性感美女被插视频| 久久人妻无码一区二区| 日韩精品中文字幕人妻| 一本大道久久香蕉成人网| 国产精品午夜福利合集| 男女一级国产片免费视频| 不卡在线一区二区三区视频| 日韩秘 无码一区二区三区 | 亚洲精品专区在线观看| 成人午夜大片免费看爽爽爽 | 国产又色又爽又黄刺激视频| 国产亚洲精品自在久久vr| chinese性内射高清国产| 亚洲高清免费在线观看| 高清国产亚洲精品自在久久| 国精品无码一区二区三区左线| 国产精品色三级在线观看| 久久精品国产亚洲AV成人毛片| 国产一区二区三区黄色片 | 国产一区二区不卡91| 艳妇臀荡乳欲伦69调教视频| 99久久国产综合精品成人影院 | 被黑人巨大一区二区三区| 亚洲精品无码高潮喷水A| 97超级碰碰碰久久久久app| 丁香婷婷色综合激情五月| 亚洲成人高清av在线| 久久国内精品一区二区三区| 日韩69永久免费视频| 乱人伦人妻中文字幕不卡| 久久中文字幕无码一区二区| 女同亚洲精品一区二区三|