当我读下一本书的“值和引用类型”一章时,我想到了一个问题:“值类型何时存储在堆栈中”?因为程序员无法在类外初始化任何值类型。因为当我们在类中初始化一些值类型的变量时,变量存储在堆中。
我的问题是:值类型什么时候存储在栈中?
最佳答案
嗯,首先,您很少需要知道,但基本上,值类型存储在它们拥有的地方。
当它们是线程执行流的一部分时,它们被存储在堆栈上,这可能意味着:
- 在“局部”(方法变量)中——排除某些情况(下文)
- 作为方法的一部分中的 float 值,即即将作为值传递给另一个方法的一个方法的返回值 - 不涉及“本地”,但该值仍在堆栈中
- 按值传递的值类型参数(即没有
ref
或out
)只是一个特例
- 按值传递的值类型参数(即没有
- 在另一个值类型的实例“字段”(一个类型变量)中,该值类型本身在堆栈中(出于上述原因)
在以下情况下,它们存储在堆上(作为对象的一部分):
- 在类的实例“字段”中
- 在自身位于堆上的值类型上的实例“字段”中
- 在一个静态的“领域”
- 在数组中
- 在作为迭代器 block 、异步方法的一部分的“局部”(方法变量)中,或者是 lambda 或匿名方法中的“捕获”变量(所有这些都会导致局部变量被提升到由编译器生成的类的字段)
- 当“装箱”时 - 即转换为引用类型(
object
、dynamic
、Enum
、ValueType
(是的:ValueType
是一个引用类型;有趣,是吧?),ISomeInterface
等)
关于c# - 值类型何时存储在堆栈中(C#)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18375946/