2015-08-03 105 views
1

正如我理解所有類變量的實例成員,靜態成員,常量s ...他們的引用將被保存在堆中,這些變量的實際值將被保存在堆棧中。什麼數據將被存儲在堆棧中在C#

如果它只是值類型不引用任何引用類型,它將只像枚舉一樣存儲在堆棧中,除了枚舉哪些數據將存儲在堆棧內存中。

如果我的理解錯誤糾正我。

回答

1

儘管引用類型總是在堆上分配,但值類型可能會分配到堆棧上 - 但不一定。值類型僅在堆棧上分配,因爲它是未包含的非轉義本地或臨時變量,該變量未包含在引用類型中,也未分配到寄存器中。

究竟會不會帶起來的堆棧:

  • 值類型的類將結束在堆的一部分。
  • 如果裝箱,它將在堆上結束。
  • 如果是一個數組,它最終會堆在堆上。
  • 如果它是一個靜態變量,它將最終堆在堆上。
  • 如果被閉包捕獲,它將最終堆在堆上。
  • 如果用在迭代器或異步塊中,它將在堆上結束。
  • 如果由不安全或非託管代碼創建,它可以分配到任何類型的數據結構中(不一定是堆棧或堆)。

當它們沒有作爲其他結構的一部分(如數組)分配時,枚舉將只在堆棧中「分配」。