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

当我阅读下一本“价值和参考类型”一书时,我想到一个问题:“什么时候价值类型存储在堆栈中”? 导致程序员无法从类中初始化任何值类型。 当我们在类中初始化一些值类型的变量时,原因是变量存储在堆中。

我的问题是:何时将值类型存储在堆栈中?


首先,你需要知道的非常罕见,但基本上,价值类型被存储在任何他们拥有的地方。

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

  • 在“本地”(一个方法变量)中 - 排除一些情况(下面)
  • 作为方法的一部分的浮点值,即来自将要作为值传递给另一方法的一个方法的返回值 - 不涉及“本地”,但该值仍然在堆栈上
  • 通过值传递的值类型参数(即不带refout )仅仅是一个特例
  • 在另一个本身位于堆栈上的值类型的实例“field”(一个类型变量)中(出于上述原因)
  • 在以下情况下,它们存储在堆上(作为对象的一部分):

  • 在一个类的实例“字段”中
  • 在本身位于堆上的值类型的实例“字段”中
  • 在一个静态的“现场”
  • 在一个数组中
  • 在一个“本地”(一个方法变量)中,它是迭代器块的一部分,异步方法,或者是lambda或匿名方法中的“捕获”变量(所有这些都会导致本地被挂载到一个字段上一个由编译器生成的类)
  • 当“boxed” - 即投入引用类型( objectdynamicEnumValueType (是: ValueType是引用类型; fun,eh?), ISomeInterface等)

  • 我的问题是:何时将值类型存储在堆栈中?

    关于价值类型的真相:

    [I]在桌面CLR的C#的微软实现中,当值是局部变量或临时值时,值类型被存储在堆栈上,该临时变量不是lambda或匿名方法的封闭局部变量,方法体不是迭代器块,并且抖动选择不注册该值


    第一次在您的问题上进行的网络搜索让您了解Eric Lippert关于价值类型的真相,它以最重要的部分开始:它几乎总是不相关的。 那么,你为什么想知道? 你会有不同的编程吗?

    无论如何:

    事实是:分配机制的选择只能与存储的已知所需生存期进行。

    链接地址: http://www.djcxy.com/p/78893.html

    上一篇: When are value types stored in stack(C#)?

    下一篇: memory range lookup against +5M record table