.NET將資料類型分為實值型別(value type)和參考型別(reference type)
一個具有實值型別(value type)的資料存放在棧內的一個變數中。即是在棧中分配記憶體空間,直接儲存所包含的值,其值就代表資料本身。實值型別的資料具有較快的存取速度。
一個具有參考型別(reference type)的資料並不駐留在棧中,而是儲存於堆中。即是在堆中分配記憶體空間,不直接儲存所包含的值,而是指向所要儲存的值,其值代表的是所指向的地址。當訪問一個具有參考型別的資料時,需要到棧中檢查變數的內容,該變數引用堆中的一個實際資料。參考型別的資料比實值型別的資料具有更大的儲存規模和較低的訪問速度。
實值型別
(1)這個類型分配在哪裡? 分配在棧上
(2)變數是怎麼表示的? 實值型別變數是局部複製
(3)基底類型是什嗎? 必須繼承自System.ValueType
(4)這個類型能作為其他類型的基類嗎? 不能。實值型別是密封的,不能被繼承
(5)預設的參數傳遞是什嗎? 變數是按值傳遞的(也就是,一個變數的副本被傳入被調用的函數)
(6)這個類型能重寫System.Object.Finalize()嗎 不能。實值型別不好放在堆上,因此不需要被終結。
(7)我可以為這個類型定義建構函式嗎? 是的,但是預設的建構函式被保留(也就是自訂建構函式必須全部帶有參數)
(8)這個類型的變數什麼時候消亡? 當它們越出定義的範圍時
引 用 類 型
(1)這個類型分配在哪裡?
分配在託管堆上
(2)變數是怎麼表示的?
參考型別變數指向被分配得執行個體所佔的記憶體
(3)基底類型是什嗎?
可以繼承自除了System.ValueType以外的任何類型,只要那個類型不是sealed的
(4)這個類型能作為其他類型的基類嗎?
是的。如果這個類型不是密封的,它可以作為其他類型的基類
(5)預設的參數傳遞是什嗎?
變數是按引用傳遞(例如,變數的地址傳入被調用的函數)
(6)這個類型能重寫System.Object.Finalize()嗎
可以間接地重寫
(7)我可以為這個類型定義建構函式嗎?
當然!
(8)這個類型的變數什麼時候消亡?
當託管堆被記憶體回收時。