值类型何时存储在堆栈(C#)中?

Ste*_*pUp 1 c#

当我阅读"值和引用类型"一章的下一本书时,我脑海中浮现出一个问题:"值类型何时存储在堆栈中"?程序员无法初始化类中的任何值类型.因为当我们在类中初始化一些值类型的变量时,变量存储在堆中.

我的问题是:什么时候存储在堆栈中的值类型?

Mar*_*ell 10

嗯,首先你很少需要知道,但基本上,价值类型存储在它们所拥有的地方.

当它们是线程执行流程的一部分时,它们存储在堆栈中,这可能意味着:

  • 在"本地"(方法变量) - 排除某些情况(下)
  • 作为方法的一部分中的浮点值,即一个方法的返回值即将作为值传递给另一个方法 - 不涉及"本地",但该值仍在堆栈中
    • 通过值传递的值类型参数(即没有ref或者out)只是一个特殊情况
  • 在一个实例"字段"(一个类型变量)上的另一个值类型本身在堆栈上(由于上述原因)

在以下情况下,它们存储在堆上(作为对象的一部分):

  • 在类的实例"字段"中
  • 在一个实例"字段"中的一个值类型本身在堆上
  • 在一个静态的"领域"
  • 在数组中
  • 在"本地"(方法变量)中,它是迭代器块,异步方法的一部分,或者是lambda或匿名方法中的"捕获"变量(所有这些都导致本地被提升到一个字段上由编译器生成的类)
  • 当"盒装" -即铸造成一个引用类型(object,dynamic,Enum,ValueType(是:ValueType?是引用类型;乐趣,EH),ISomeInterface等等)