2017年7月20日 星期四

[C#] Value Types, Reference Types, Pointers


  • 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

沒有留言:

張貼留言