- C# 有兩種資料型別:
- 實值(Value Types)和參考(Reference Types)
- 如果應用程式的效能很重要,或是如果您對 C# 如何管理資料和記憶體有興趣,了解兩者之間的差別就很重要。
- Value Type
- 繼承自 System.ValueType
- 儲存的值是「實值」(Value)
- 當變數是以基本內建資料型別其中之一,或使用者定義的結構進行宣告時
- bool
- byte
- char
- decimal
- double
- enum
- float
- int
- long
- sbyte
- short
- struct
- ...
- 將內容儲存在配置於堆疊 (Stack) 的記憶體中
int x = 42;
- 當變數 x 因為所定義的方法完成執行而超出範圍時,堆疊就會捨棄此值。
- 使用堆疊很有效率,但是實值型別有限的存留期,使其較不適合在不同類別之間共用資料
- Reference Types
- 不是繼承自 System.ValueType 的型別,都不是 Value Type
- 儲存的值是「參考」(Reference),也就是記憶體的位址,指向儲存真實內容的記憶體區塊的開始位置
- 參考型別 (例如類別或陣列的執行個體)
- class
- interface
- delegate
- object
- string
- 配置在稱為堆積 (Heap) 的不同記憶體區域中
int[] numbers = new int[10];
- 當方法完成時,這段記憶體不會歸還給堆積,只有當 C# 的記憶體回收系統判定不再需要它時才會回收。在宣告參考型別時需要較大的額外負荷,但是它們有可以從其他類別存取的優點
- 需要GC(Garbage collection:垃圾收集器)清理
- Value Type and Reference Type
- 記憶體用途分為 Stack 與 Heap 兩種
- 最顯著的差別,記憶體中儲存其變數值的方式
- 所有的區域變數 (不管是 Value Type 或是 Reference Type),其內容 (變數名稱、型別與與值) 都是儲存在 Stack 中
- new 關鍵字實體化類別的物件,其物件內容,是儲存在 Heap 中
- Reference Type 變數中所儲存的參考,其實是指向 Heap 中的記憶體位址
- 由於 Value Type 與 Reference Type 在記憶體儲存值上的差異,在使用上若不理解,有時會造成意料外的問題
- Pointer Type
- 主要是 C/C++ 語言,對記憶體直接操作
- 在內存區中,指向一個類型的引用,通常被稱為 Pointer Type
- 它是受CLR (Common Language Runtime:公共語言運行時) 管理,我們不能顯示使用
- 需要註意,一個類型的引用即 Pointer Type 跟 Reference Type 是完全不同概念
- Pointer Type 在內存中占一塊內存區,它本身代表一個內存地址 (或者null),它所指向的另一塊內存區才是我們真正的數據或者類型
- Ref:
- https://msdn.microsoft.com/zh-tw/library/4d43ts61(v=vs.90).aspx
- http://xingulin.tumblr.com/post/48493582986/ref-type-vs-val-type
- http://www.c-sharpcorner.com/article/C-Sharp-heaping-vs-stacking-in-net-part-i/
- https://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types
- http://www.15jb.net/article/43475.html
- http://m.jb51.net/article/55306.htm
沒有留言:
張貼留言