[你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內存有理
[2] [你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內存有理
[3] [你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內存有理
系列文章導航:
[你必須知道的.NET] 第四回:后來居上:class和struct
[你必須知道的.NET] 第五回:深入淺出關鍵字---把new說透
[你必須知道的.NET] 第六回:深入淺出關鍵字---base和this
[你必須知道的.NET] 第七回:品味類型---從通用類型系統開始
[你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內存有理
[你必須知道的.NET] 第九回:品味類型---值類型與引用類型(中)-規則無邊
[你必須知道的.NET] 第十回:品味類型---值類型與引用類型(下)-應用征途
[你必須知道的.NET] 第十一回:參數之惑---傳遞的藝術(上)
[你必須知道的.NET] 第十二回:參數之惑---傳遞的藝術(下)
[你必須知道的.NET] 第十三回:從Hello, world開始認識IL
[你必須知道的.NET] 第十四回:認識IL代碼---從開始到現在
[你必須知道的.NET] 第十六回:深入淺出關鍵字---using全接觸
[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考
[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
本文將介紹以下內容:
•類型的基本概念
•值類型深入
•引用類型深入
•值類型與引用類型的比較及應用
1. 引言
買了新本本,忙了好幾天系統,終于開始了對值類型和引用類型做個全面的講述了,本系列開篇之時就是因為想寫這個主題,才有了寫個系列的想法。所以對值類型和引用類型的分析,是我最想成文的一篇,其原因是過去的學習過程中我就是從這個主題開始,喜歡以IL語言來分析執行,也喜好從底層的過程來深入了解。這對我來說,似乎是一件找到了有效提高的方法,所以想寫的沖動就沒有停過,旨在以有效的方式來分享所得。同時,我也認為,對值類型和引用類型的把握,是理解語言基礎環節的關鍵主題,有必要花力氣來了解和深入。
2. 一切從內存開始
2.1 基本概念
從上回《第七回:品味類型---從通用類型系統開始》我們知道,CLR支持兩種基本類型:值類型和引用類型。因此,還是把MSDN這張經典視圖拿出來做個鋪墊。
值類型(Value Type),值類型實例通常分配在線程的堆棧(stack)上,并且不包含任何指向實例數據的指針,因為變量本身就包含了其實例數據。其在MSDN的定義為值類型直接包含它們的數據,值類型的實例要么在堆棧上,要么內聯在結構中。我們由上圖可知,值類型主要包括簡單類型、結構體類型和枚舉類型等。通常聲明為以下類型:int、char、float、long、bool、double、struct、enum、short、byte、decimal、sbyte、uint、ulong、ushort等時,該變量即為值類型。
引用類型(Reference Type),引用類型實例分配在托管堆(managed heap)上,變量保存了實例數據的內存引用。其在MSDN中的定義為引用類型存儲對值的內存地址的引用,位于堆上。我們由上圖可知,引用類型可以是自描述類型、指針類型或接口類型。而自描述類型進一步細分成數組和類類型。類類型是則可以是用戶定義的類、裝箱的值類型和委托。通常聲明為以下類型:class、interface、delegate、object、string以及其他的自定義引用類型時,該變量即為引用類型。
下面簡單的列出我們類型的進一步細分,數據來自MSDN,為的是給我們的概念中有清晰的類型概念,這是最基礎也是最必須的內容。