程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#基礎原理拾遺——引用類型的值傳遞和引用傳遞

C#基礎原理拾遺——引用類型的值傳遞和引用傳遞

編輯:C#入門知識

      以前寫博客不深動,只搭個架子,像做筆記,沒有自己的思考,也沒什麼人來看。這個毛病得改,就從這一篇開始…

      最近准備面試,深感基礎之重要,奈何我不是計算機科班出身,基礎方面有些捉襟見肘。短期怎麼補?做面實題呗。遇到哪兒沒理解透,自己查資料,印象深刻。這個問題就是這麼來的。原題很簡單:“對於方法,參數傳遞分為值傳遞和____兩種。”這還不簡單,但我得拓展啊,得思考啊…

      以下1、2是我的意淫,但記錄自己的一些錯誤想法並思考改正還是有益處的,希望不會對大家有誤導。覺得麻煩的話可以直接看3。

1、什麼是值傳遞和引用傳遞?

      我一開始的理解是,值類型根本沒有引用啊,它能有引用傳遞?它的值傳遞和引用傳遞應該是一樣的。至於引用類型,它的值傳遞應該是一個深拷貝,引用傳遞應該是一個淺拷貝。對於這一類比,最初還頗感得意。但查資料才知道,What a stupid idea!沒辦法,非科班出身,知識不成體系,有盲點,但我知道這不是借口,這不在大補嘛,補得跟小雞子似的。

      看了http://www.cnblogs.com/whc-blog/archive/2011/07/20/2111803.html這篇,感性的知道了什麼是值傳遞和引用傳遞。其實也不是壓根不知道,長時間不用忘了,然後就出現了上面離奇的想法。

      其實在整個思考完了以後我給值傳遞和引用傳遞下了個定義,在這裡先搬出來:(歡迎大家批評指正)

值傳遞是傳遞棧中的值;引用傳遞是傳遞棧地址。

2、引用類型的值傳遞和引用傳遞可以類比成深拷貝和淺拷貝嗎?

     到此對於這個問題還是有疑問的,就寫了個小Demo

  Main(=  Student(, 
            Console.WriteLine(xiaohong.Name +    +
          BanZheng(= = 
         = =  Student( name, ==  Name { ;   Age { ; 

      解釋一下:小紅今年12,但她要工作,可能家庭困難吧。1、如果她有關系(有關系還家庭困難?解釋不了),找到BanZheng方法,給她身份證改成“紅姐”18,拿去Main方法輸出驗證,果然輸出“紅姐”18。呵呵。但按我理解,ref如果是淺拷貝的話,Age作為一個值類型屬性應該是重新烤了一份,其值不應該回傳給xiaohong啊,應該輸出“紅姐”12。看來有關系就是牛逼啊。2、如果她沒關系,找了個辦假證的BanJiaZheng,一驗證還是“紅姐”18,如果按我理解,值傳遞是深拷貝的話,student參數應該和xiaohong是兩個完全不同的對象,應該輸出“小紅”12,看來這個認證機構(我的理解)有水。於是我再查資料…

3、引用類型的值傳遞和引用傳遞揭秘

     功夫不負有心人,找到這麼一篇好文http://www.cnblogs.com/duanwg/archive/2006/07/21/456247.html,其實看了它就能理解了,但我還是根據上面的Demo做些改進,加深理解。

  Main(=  Student(, 
            Console.WriteLine(xiaohong.Name +    +  BanZheng(
=  Student(,  
=  Student(,  Student( name, ==  Name { ;   Age { ; 

      這一次辦證方法改了,在方法體中student = new Student(…)。再到Main方法中驗證一下,如果調用BanZheng方法,輸出“紅姐”18,如果調用BanJiaZheng方法,輸出“小紅”12。看來有關系到什麼時候都很牛逼啊。

      畫兩個圖理解一下:

(1)如果是BanJiaZheng,即值傳遞的話:

變量xiaohong和student的棧中有相同的堆地址,都指向10000,即“小紅”12,而在BanJiaZheng方法中student = new Student(…),開辟了10010堆,student的棧中的堆地址改為10010,而xiaohong的棧中堆地址還是10000。所以方法調用後xiaohong指向的對象沒變,依然是“小紅”12。

(2)如果是BanZheng,即引用傳遞的話:

變量xiaohong和student指向同一棧地址,在student = new Student(…)後,該棧001指向新的堆地址10010,而xiaohong也指向001棧。所以方法調用後xiaohong指向的對象變成了“紅姐”18。

      至此,我總結出:值傳遞是傳遞棧中的值;引用傳遞是傳遞棧地址。

      這一次我是蠻認真的寫的這篇博客,希望人氣能好一點,不吝留言賜教的話就感激不盡了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved