引用:
宣告circle變數時,編譯器不生成**來分配足以容納乙個circle的記憶體塊,相反,它唯一做的事情,就是分配乙個小塊記憶體,其中剛好可以容納乙個位址…以後,circle實際占用記憶體塊的位址會填充到這裡該位址稱為對記憶體塊的引用,circle物件實際占用的記憶體是在使用new關鍵字建立物件時分配的//
circle c;
c = new circle();
以上**在記憶體中的變化步驟:
1.在棧中分配出一小塊記憶體,它剛夠儲存乙個引用(乙個記憶體位址),只是暫時不進行初始化(它是為circle型別的變數c準備的).
2.接著 要從堆中分配乙個足夠大的記憶體區域來容納乙個circle物件. 這正是new關鍵字所執行的操作:它執行circle構造器,將這個原始的堆記憶體轉換成circle物件,對這個circle物件的引用將儲存到變數c中
ps: 只複製引用成為淺拷貝, 能夠複製引用的物件成為深拷貝
object型別 為所有類的基類, object型別的變數能夠引用任何物件
將資料項從棧自動複製到堆的行為稱為裝箱
circle c;
c = new circle(42);
object
o;o = c;
/~~~~~~~~~分割~~~~~~~~~/
將資料項從棧自動複製到堆的行為稱為裝箱
int i = 42;
object o = i;
// 修改變數i的原始值,o所引用的堆上的值不會改變,類似地,修改堆上的值,變數的原始值也不會改變
/~~~~~~~~~分割~~~~~~~~~/
為了訪問已裝箱的值,必須進行強制型別轉換,簡稱轉型
int i = 42;
object o = i; // 裝箱
i = (int)o // 成功編譯
編譯器發現了指定的型別int,所以會在執行時生成**檢查o實際引用的是什麼,它可能引用任何東西 不能因為你在轉型說o引用的是int 它就真的引用乙個int 如果說o真的引用乙個已裝箱的int 轉型就會成功執行,編譯器生成的**會從裝箱的int中提取出值,這個過程稱為拆箱
ps:指標是特殊變數,其中容納著記憶體(堆或棧)中的乙個資料項的位址(或者說對這個資料項的引用)
值型別 引用型別,裝箱 拆箱
值型別 宣告乙個值型別變數,會在棧上分配乙個空間,空間裡儲存的就是變數的值 引用型別 宣告乙個引用型別變數,會在棧中分配乙個空間,儲存乙個引用,這個引用指向了乙個託管堆。值型別 struct,列舉,數值型別,bool型別 引用型別 陣列,類,介面,委託 delegate object,string ...
值型別和引用型別,裝箱和拆箱
c 中任何型別都是隱式繼承自 system.object 引用型別 分為兩大類,值型別和引用型別。值型別包括 簡單型別 int,float,double等 結構體,列舉 引用型別包括 自定義的類,字串,介面,陣列 區別 1.值型別儲存在棧中,自動釋放,比較高效 引用型別儲存在堆中,需要手動釋放 2....
C 裝箱和拆箱(值型別和引用型別)
在 c 語言中資料型別分為值型別和引用型別,將值型別轉換為引用型別的操作稱為裝箱,相應地將引用型別轉換成值型別稱為拆箱。c tostring 方法用於將任意的資料型別轉換成字串型別,例如將整數型別轉換成字串型別。int a 100 string str a.tostring 裝箱 在上面的轉換中 i...