C#基礎知識1-深刻理解值類型和引用類型

  C#值類型和引用類型這個概念在剛學習的時候應該就知道了。可是咱們並無深刻的去理解它。越是基礎知識其實才是最有用的。對代碼的優化,代碼質量的提高都有幫助。經過整理本文章,對不少知識也起到了鞏固的做用吧。html

 

1,值類型面試

  值類型有:整型,浮點型,十進制,布爾型,struct,枚舉。值類型是在線程棧上分配的,值類型也稱輕量級類型,一個值類型的變量就包含了值類型的值,因此它沒有引用類型的指針。全部值類型的數據都沒法爲null,因此咱們聲明時必須賦初始值。數組

 

2,引用類型性能

  引用類型有:class(類),interface(接口),delegate(委託),object,string,數組。​​​引用類型是在託管堆上分配的,咱們經常使用的new操做符會返回一個對象的指針,也就是對象數據在內存中的地址的一個引用。引用類型的傳遞其實就是傳遞對象的指針。引用類型在建立時默認爲null,也就是當前變量不指向一個有效的對象,這時若是咱們去讀取null對象裏的屬性值時就會出現咱們常碰見的異常:「未將對象的引用設置到對象的實例」,是否是很熟悉。因此在實際開發中咱們在操做對象的時候必定要先判斷該對象是否是爲null,避免異常。學習

值類型和引用類型咱們用的都比較多,那確定就避免不了裝箱和拆箱操做。優化

 

3,什麼是裝箱?spa

裝箱就是值類型轉爲引用類型。線程

 

4,什麼是拆箱?指針

拆箱就是引用類型轉爲值類型。這裏要注意兩點:code

  4.1,只有被裝箱過的對象才能被拆箱

  4.2,一個對象拆箱後只能還原爲未裝箱以前的類型。看下面代碼

1 int i = 5;
2 object obj = i;//裝箱操做
3 Int16 j = (Int16)obj;//拆箱操做

咱們先給i作了裝箱操做。而後在拆箱。可是還原的是Int16類型,這裏就會拋出異常:「指定的轉換無效」。

 

5,有的同窗說裝箱和拆箱都影響性能,那麼究竟是裝箱影響呢仍是拆箱影響呢仍是都影響呢?

5.1,裝箱都發生了什麼呢

  1,首先在託管堆中分配好內存,分配的內存量是值類型字段須要的內存量加上託管堆上須要的對象的兩個額外成員(對象指針,同步塊索引)須要的內存。

  2,值類型的字段複製到新分配的內存中。

  3,返回對象的地址,也就是對象的引用。

 

5.2,拆箱都發生了什麼呢

  1,獲取已裝箱的值類型實例的指針。

  2,把獲取到的值複製到棧。

 


因此裝箱時比較耗費性能的,還有可能引起一次GC操做,而拆箱只是一個獲取指針的過程耗費資源比裝箱要小的多。正由於值類型有裝箱拆箱操做,因此像ArrayList這樣的集合性能時很是使人擔心的,因此C#2.0出現的泛型:List<>​,減小了裝箱拆箱操做。

 

6,應用場景

首先不止時面試的時候會常常問到應用場景這個問題,咱們平時寫程序的時候也很清楚,大多狀況下咱們都會使用引用類型。那何時會使用值類型呢?

  6.1,類型不會有被繼承的可能,也不會繼承其餘的類型。

  6.2,類型的實例比較小,不會被作爲方法的參數,不會被頻繁賦值。

 


本文就到此結束了。感受本身也學到了很多東西,之後沒事的時候也能夠拿來看看,同時呢也但願能夠幫助到須要的人,若有錯誤的地方還望大神指點,繼續加油!

 

原文來自:C#基礎知識1-深刻理解值類型和引用類型-曾亞平我的博客

 

相關文章
相關標籤/搜索