先簡單介紹一下它們:
嚴格來說應該是下面的這些:值類型包括:結構體(數值類型,bool型,用戶定義的結構體),枚舉,可空類型。
引用類型包括:數組,用戶定義的類、接口、委托,object,字符串
為什么要設計值類型:
綜上,值類型更有效率,所以在.NET中將一些簡單的,常用的,內存占用小的對象設置為值類型,大大提高了整個CLR的效率。
裝箱與拆箱:
為什么會發生裝箱:
因為值類型與引用類型在CLR中的內存管理方式不同,所以當值類型在程序中需要向引用類型轉化的時候就會發生裝箱。也就是當值類型的實例對象需要在一個程序作用域的場景下,轉化成為不從System.ValueType繼承的另外一個類型的對象時,裝箱就會發生。
裝箱有什么危害:
因為設計值類型的本意是為了提升效率。但是當裝箱發生時,值類型會轉化成為引用類型,這個時候,效率沒有得到任何提高。反而因為裝箱,拆箱有可能重復多次的發生,反而讓效率更受影響。
值類型和引用類型的區別:
1. 值類型的數據存儲在內存的棧中;引用類型的數據存儲在內存的堆中,而內存單元中只存放堆中對象的
地址。
2. 值類型存取速度快,引用類型存取速度慢。
3. 值類型表示實際數據,引用類型表示指向存儲在內存堆中的數據的指針或引用
4. 值類型繼承自System.ValueType,引用類型繼承自System.Object
5. 棧的內存分配是自動釋放;而堆在.NET中會有GC來釋放
6. 值類型的變量直接存放實際的數據,而引用類型的變量存放的則是數據的地址,即對象的引用。
7. 值類型變量直接把變量的值保存在堆棧中,引用類型的變量把實際數據的地址保存在堆棧中,而實際
數據則保存在堆中。注意,堆和堆棧是兩個不同的概念,在內存中的存儲位置也不相同,堆一般用于存儲
可變長度的數據,如字符串類型;而堆棧則用于存儲固定長度的數據,如整型類型的數據int(每個int變量
占用四個字節)。由數據存儲的位置可以得知,當把一個值變量賦給另一個值變量時,會在堆棧中保存兩
個完全相同的值;而把一個引用變量賦給另一個引用變量,則會在堆棧中保存對同一個堆位置的兩個引用
,即在堆棧中保存的是同一個堆的地址。在進行數據操作時,對于值類型,由于每個變量都有自己的值,
因此對一個變量的操作不會影響到其它變量;對于引用類型的變量,對一個變量的數據進行操作就是對這
個變量在堆中的數據進行操作,如果兩個引用類型的變量引用同一個對象,實際含義就是它們在堆棧中保
存的堆的地址相同,因此對一個變量的操作就會影響到引用同一個對象的另一個變量。
新聞熱點
疑難解答