C#數據類型可以分值類型和引用類型。值類型,先說說一個概念 c#棧和堆. 一,棧和堆. 堆:在c裡面叫堆,在c#裡面其實叫托管堆。為什麼叫托管堆,我們往下看。 棧:就是堆棧,因為和堆一起叫著彆扭,就簡稱棧了。後進先出 托管堆不同於堆,它是由CLR(公共語言運行庫(Common Language Ru ...
C#數據類型可以分值類型和引用類型。值類型,先說說一個概念 c#棧和堆.
一,棧和堆.
堆:在c裡面叫堆,在c#裡面其實叫托管堆。為什麼叫托管堆,我們往下看。
棧:就是堆棧,因為和堆一起叫著彆扭,就簡稱棧了。後進先出
托管堆不同於堆,它是由CLR(公共語言運行庫(Common Language Runtime))管理,當堆中滿了之後,會自動清理堆中的垃圾。所以,做為.net開發,我們不需要關心記憶體釋放的問題。
數據結構堆棧:是一種後進先出的數據結構,它是一個概念,棧是一種後進先出的數據結構。而堆是一塊記憶體區域,與棧不同,堆里的記憶體能夠以任意順序存入和移除
記憶體堆棧:存在記憶體中的兩個存儲區(堆區,棧區)。
棧區:存放函數的參數、局部變數、返回數據等值,由編譯器自動釋放
堆區:存放著引用類型的對象,由CLR釋放
棧空間比較小,但是讀取速度快
堆空間比較大,但是讀取速度慢
二,值類型和引用類型
值類型。
值類型是在棧中分配記憶體,在聲明時初始化才能使用,不能為null。
值類型超出作用範圍系統自動釋放記憶體。
主要由兩類組成:結構,枚舉(enum),結構分為以下幾類:
1、整型(Sbyte、Byte、Char、Short、Ushort、Int、Uint、Long、Ulong)
2、浮點型(Float、Double)
3、decimal
4、bool
5、用戶定義的結構(struct)
引用類型。
引用類型在堆中分配記憶體,初始化時預設為null。
引用類型是通過垃圾回收機制進行回收。
包括類、介面、委托、數組以及內置引用類型object與string。
註意: 但我們使用引用類型賦值時,其實是賦值的引用類型的引用,如果數組是一個值類型的數組,那麼數組中直接存儲值,如果是一個引用類型的數組(數組中存儲的是引用類型),那麼數組中存儲的是引用(記憶體地址)
三 裝箱 拆箱
由於C#中所有的數據類型都是由基類System.Object繼承而來的,所以值類型和引用類型的值可以通過顯式(或隱式)操作相互轉換,而這轉換過程也就是裝箱(boxing)和拆箱(unboxing)過程。
裝箱 是值類型到 object 類型或到此值類型所實現的任何介面類型的隱式轉換。對值類型裝箱會在堆中分配一個對象實例,並將該值複製到新的對象中。
拆箱 是從 object 類型到值類型或從介面類型到實現該介面的值類型的顯式轉換。