c#值型別引用型別第一章
阿新 • • 發佈:2020-06-22
概要
本篇文章主要簡單扼要的講述值型別和引用型別更進階的理解和使用。如果希望更多的瞭解和技術討論請記得看文章末尾,望各位看官多多支援多多關注,關注和支援是我更新文章的最大動力。在這裡謝謝大家。溫馨提示:通篇閱讀大約10分鐘,後續會以一個系列方式來講解望大家持續關注,會附上執行程式碼來證實理論。
內容簡介
值型別和應用型別的區別
主要內容
值型別
- 值型別分配線上程棧中。
- 值型別傳遞的是值的本身,對值型別變數的操作不可能影響另外一個值型別的值。
- 值型別值型別物件有兩種表現形式:裝箱和未裝箱。
- 值型別從System.ValueType派生。該型別提供了與System.Object相同的方法。但是System.ValueType重寫了Equlas方法,能在兩個物件的欄位值完全匹配的前提下返回true。也重寫了GetHashCode方法。生成雜湊碼是,這個重寫方法所用的演算法會將物件例項欄位中的值考慮在內。
- 值型別變數賦值給另一個值型別變數,會逐欄位的複製。
- 未裝箱的值型別,不在被使用時為它分配的儲存空間會被自動釋放,而不是等待GC回收。
- 值型別不能作為積累性來定義,新的值型別或者新的引用型別,所以不能引入任何新的虛方法。所有方法都不能是抽象的,所有方法都是隱式密封不可重寫。
- 由於值型別從System.ValueType派生的,是沒有同步索引塊和物件指標的,所以在記憶體佔用上比引用型別小。操作速度比引用型別快。
引用型別
- 引用型別分配在託管堆中。
- 引用型別傳遞的是值的副本,兩個或多個引用型別變數能引用堆中的同一個物件,所以對一個變數執行操作時可能影響另一個變數的值。
- 引用型別總是處於已裝箱形式。
- 引用型別變數賦值給另一個引用型別變數,只複製記憶體地址。
- 引用型別可作為基型別,派生出其他派生類。
- 引用型別從System.Objectt派生的是有同步索引塊和物件指標的,什麼是同步索引塊呢,在使用lock中大家都會new一個object物件所以lock的物件而就是因為有同步索引塊而且空的objcet物件結構穩定不會發生變化所以lock才能發揮作用。那什麼是物件指標呢,物件指標就是編譯器告訴你現在用的是什麼物件具體體現在引用型別的GetType()方法,實質上就是呼叫物件指標拿到物件型別。
結尾
到這裡大致我們對值型別和應用型別的區別有個初步的認識,後面的文章中將會逐漸加深講解並寫Demo專案以供大家學習。 希望大家多多支援關注,不勝感激。
- E-Mail:[email protected]
- QQ: 580749909
- Blog: https://www.cnblogs.com/justzhuzhu/
- Git: https://github.com/JusterZhu
- 知乎:https://www.zhihu.com/people/juster-zhu
- 微信公眾號