值型別和引用型別的基礎知識
先舉個例子,假如你現在在讀乙份報紙,為了給朋友乙份,將報紙的全部內容影印了乙份並交給他。他獲得了乙份屬於自己的完整報紙。在這種情況下,我們處理的是值型別行為,所有的資訊都掌握在自己手裡,不需要從其他地方獲取,你和朋友手中的是各自獨立的,你在自己的報紙上新增注釋,朋友的報紙上不會看見。
再假設你現在再看乙個網頁,與之前相比這次你給朋友的只是乙個網頁的url,這種情況下,幾時引用型別行為,url代替了引用。為了能看到網頁,需要在瀏覽器的輸入url來載入,假如網頁由於某種原因需要改變,下次你個朋友開啟的網頁都會看到改變後的網頁。
通過上面的例子應該會好理解一些,值型別和引用型別,兩者之間本來沒有多大的聯絡,設計人員通過一種名為裝拆箱的操作,使得這兩種型別建立了新的聯絡,讓和任何 值型別都可以當成物件引用型別來操作。在c#中梳理了一下這兩種型別
值型別:整型int;長整型long;浮點型float;字元型 char;布林型bool;列舉 enum;結構 struct;他們統一繼承valuetype
引用型別:陣列,自定義類,委託,object,介面,字串等;
裝箱和拆箱
拆箱:引用型別轉化為值型別的過程。獲取引用型別的位址,將用用物件的值拷貝到棧上的值型別例項中(注意 拆箱時可能會引發「轉換無效」的異常。要記住,拆箱時強轉的值型別,應以裝箱時的值型別一致)
裝箱時 i是值型別的變數,o是引用型別的變數。將i的值賦給o有道理嗎?o的值必須是乙個引用,而數字10不是引用,它是乙個整數值。實際發生的事情就是裝箱:執行時將在堆上建立乙個包含值(10)的物件(它是乙個普通物件)。o的值是對該新物件的乙個引用。該物件的值是原始值的乙個副本,改變i的值不會改變箱內的值。
相反的操作—拆箱。必須告訴編譯器將object拆箱成什麼型別。如果使用了錯誤的型別(比如ob原先被裝箱成unit或者long,或者根本就不是乙個已裝箱的值),就會丟擲乙個invalidcastexception異常。同樣,拆箱也會複製箱內的值,在賦值之後,m和該物件之間不再有任何關係。
通過上述的原理可以看出,裝拆箱分配記憶體和拷貝資料會影響效能的操作,盡量避免裝拆箱。
c 裝箱和拆箱
c 裝箱和拆箱 概念 裝箱 將值型別轉換為引用型別的過程叫做裝箱 值型別 引用型別 相反,拆箱 將引用型別轉換為值型別 叫做拆箱 引用型別 值型別 裝箱例子 int i 2008 object obj i console.writeline 1 i的值為,裝箱之後的值 i,obj i 927 con...
C 裝箱和拆箱
1 什麼是裝箱和拆箱 裝箱是將值型別轉換為引用型別 拆箱是將引用型別轉換為值型別 2 什麼時候需要裝箱?值型別是高效輕量的型別,因為預設情況下在堆上不包括他們的物件元件,然而,如果我們需要物件元件,這個時候就需要裝箱了。最常見的場景就是 乙個方法你希望能共用,設定的引數型別是object型別 引用型...
C 裝箱和拆箱
值型別例項進行裝箱時的步驟 1 在託管堆中分配記憶體。需要注意的是,由於是將值型別進行引用型別化,因而分配的記憶體空間除了值型別各個欄位所需的記憶體之外,還要加上託管堆所有物件都有的兩個額外成員 型別物件指標和同步塊索引 所需的記憶體。2 將值型別的字段複製到新分配的堆記憶體中。3 返回物件位址,即...