System.Objec時C#中所有類型的基類,也就是萬類之源。 一、值類型 值類型都繼承自System.ValueType(派生自System.Objec),繼承自System.ValueType的類型在CLR中具有特殊的行為,值類型變數直接包含它們的值。對於值類型變數,沒有單獨的堆分配或垃圾回收 ...
System.Objec時C#中所有類型的基類,也就是萬類之源。
一、值類型
值類型都繼承自System.ValueType(派生自System.Objec),繼承自System.ValueType的類型在CLR中具有特殊的行為,值類型變數直接包含它們的值。對於值類型變數,沒有單獨的堆分配或垃圾回收開銷。
值類型分為兩類:結構和枚舉
1.結構
值類型為“密封”,也就是結構類型不能派生類型,並且不能把結構類型定義為從任何用戶定義的類或結構繼承,因為結構只能繼承自System.ValueType。但是一個結構可以繼承一個或多個介面。可將結構類型強制轉化為Object類型或任何它所繼承的介面類型,但這會發生裝箱操作。
2.枚舉
枚舉定義的一組已命名的整型變數。所有的枚舉都繼承自System.Enum(繼承自System.ValueType)。適用於結構的規則也適用於枚舉。
二、引用類型
定義為類、介面、委托或數組的類型都是引用類型。在運行時,當聲明引用類型的變數時,該變數為一直包含值null,直至使用new運算符顯示創建對象,或為該變數分配已在其他位置使用new創建的對象。
三、裝箱與拆箱
裝箱:將值類型轉化為Object類型或由此之類型實現的任何介面類型的過程。CLR對值類型進行裝箱操作時,會將值包裝到System.Object內部,再將後者存儲托管堆中。
拆箱:拆箱就是從對象中取出值類型。
裝箱是隱式的,拆箱是顯式的。性能上,裝箱和拆箱會造成一定的性能損失。對值類型進行裝箱時必須分配並創建對象,拆箱時的強制轉換也需要進行大量的計算。值得註意的是拆箱強轉的值類型應與裝箱時的值類型一致。