当我阅读下一本书“值和引用类型”一章时,我想到了一个问题:“值类型何时存储在堆栈中”?原因程序员无法在类外初始化任何值类型。因为当我们在类中初始化一些值类型的变量时,变量存储在堆中。
我的问题是:值类型何时存储在堆栈中?
当我阅读下一本书“值和引用类型”一章时,我想到了一个问题:“值类型何时存储在堆栈中”?原因程序员无法在类外初始化任何值类型。因为当我们在类中初始化一些值类型的变量时,变量存储在堆中。
我的问题是:值类型何时存储在堆栈中?
嗯,首先你很少需要知道,但基本上,值类型存储在它们所拥有的任何地方。
当它们是线程执行流程的一部分时,它们会存储在堆栈中,这可能意味着:
ref
or out
)只是这种情况的一个特例它们在以下情况下存储在堆中(作为对象的一部分):
object
, dynamic
, Enum
, ValueType
(是的:ValueType
是引用类型;有趣,嗯?)ISomeInterface
,等等)我的问题是:值类型何时存储在堆栈中?
从关于值类型的真相:
[I]在桌面CLR上的C#微软实现中,当值是局部变量或临时值而不是lambda或匿名方法的封闭局部变量时,值类型存储在堆栈中,并且方法体不是迭代器块,并且抖动选择不注册该值
准确地说,堆栈和堆在托管环境中是(或应该是)不相关的。
在实践中,局部变量值类型(C# 中的结构)倾向于在堆栈上分配。但是,在某些情况下,它们被分配在堆上。
一种这样的情况是当它们被装箱时。装箱意味着使用 anInt32
作为Object
,例如通过将其传递给采用object
参数的方法。造成这种情况的一个原因是多态性:结构不携带 vTable 指针,因此不能进行动态虚拟方法解析(例如ToString()
,对于诸如 的方法) - 但它们是密封的,因此它们可以静态进行解析。另一方面,如果一个结构被强制存储在一个object
引用中,它需要被转换为一个堆分配的支持 vTable 的对象。
当它是堆分配对象的一部分时,也可以在堆中分配值类型- 例如,当它是类的数据成员(字段)时。
另一个混淆来源似乎是您假设引用类型和值类型是两种类型的类,这是不正确的
关键字class
-> 引用类型
关键字struct
-> 值类型
对您的问题的第一次网络搜索为您提供 Eric Lippert 的The Truth About Value Types,它从最重要的部分开始:它几乎总是无关紧要的。那么,你为什么想知道?你会以不同的方式编程吗?
反正:
事实是:分配机制的选择只与存储所需的已知生命周期有关。