天天看點

C#中值類型和引用類型差別

在C#中

值類型:整型、布爾型、字元型、實數型、結構型、枚舉型。

引用類型:類、對象、字元串、數組、接口、委托。

C#中值類型和引用類型差別

差別:

1、值類型通常被配置設定在棧上,它的變量直接包含變量的執行個體,使用效率比較高。

2、引用類型配置設定在托管堆上,引用類型的變量通常包含一個指向執行個體的指針,變量通過該指針來引用執行個體。

3、值類型繼承自ValueType(注意:而System.ValueType又繼承自System.Object);而引用類型繼承自System.Object。 

4、值類型變量包含其執行個體資料,每個變量儲存了其本身的資料拷貝(副本),是以在預設情況下,值類型的參數傳遞不會影響參數本身;而引用類型變量儲存了其資料的引用位址,是以以引用方式進行參數傳遞時會影響到參數本身,因為兩個變量會引用了記憶體中的同一塊位址。

5、值類型有兩種表示:裝箱與拆箱;引用類型隻有裝箱一種形式。 

6、典型的值類型為:struct,enum以及大量的内置值類型;而能稱為類的都可以說是引用類型。 

7、值類型的記憶體不由GC(垃圾回收,Gabage Collection)控制,作用域結束時,值類型會自行釋放,減少了托管堆的壓力,是以具有性能上的優勢。例如,通常struct比class更高效;而引用類型的記憶體回收,由GC來完成,微軟甚至建議使用者最好不要自行釋放記憶體。

8、值類型是密封的(sealed),是以值類型不能作為其他任何類型的基類,但是可以單繼承或者多繼承接口;而引用類型一般都有繼承性。 

9、值類型不具有多态性;而引用類型有多态性。 

10、值類型變量不可為null值,值類型都會自行初始化為0值;而引用類型變量預設情況下,建立為null值,表示沒有指向任何托管堆的引用位址。對值為null的引用類型的任何操作,都會抛出NullReferenceException異常。

11、值類型有兩種狀态:裝箱和未裝箱,運作庫提供了所有值類型的已裝箱形式;而引用類型通常隻有一種形式:裝箱。 

值類型:

            包括基元類型、使用者自定義結構或枚舉類型

            繼承自System.ValueType類型

            在堆棧上配置設定

            通過拷貝指派

            預設通過值來傳遞參數,除非用ref關鍵字

引用類型:

            C#預定義的引用類型包括object和string類型,使用者定義的引用類型可以是接口類型、類類型和委托類型

            繼承自System. Object類型

            在托管堆上用“new”關鍵字配置設定

            通過引用指派

            可能出現幾個引用指向同一個對象,是以對一個變量的操作會影響另一個變量所引用的同一對象 

            用引用來傳遞變量

繼續閱讀