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

标签 c#

当我读下一本书的“值和引用类型”一章时,我想到了一个问题:“值类型何时存储在堆栈中”?因为程序员无法在类外初始化任何值类型。因为当我们在类中初始化一些值类型的变量时,变量存储在堆中。

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

最佳答案

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

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

  • 在“局部”(方法变量)中——排除某些情况(下文)
  • 作为方法的一部分中的 float 值,即即将作为值传递给另一个方法的一个方法的返回值 - 不涉及“本地”,但该值仍在堆栈中
    • 按值传递的值类型参数(即没有 refout)只是一个特例
  • 在另一个值类型的实例“字段”(一个类型变量)中,该值类型本身在堆栈中(出于上述原因)

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

  • 在类的实例“字段”中
  • 在自身位于堆上的值类型上的实例“字段”中
  • 在一个静态的“领域”
  • 在数组中
  • 在作为迭代器 block 、异步方法的一部分的“局部”(方法变量)中,或者是 lambda 或匿名方法中的“捕获”变量(所有这些都会导致局部变量被提升到由编译器生成的类的字段)
  • 当“装箱”时 - 即转换为引用类型(objectdynamicEnumValueType(是的:ValueType 是一个引用类型;有趣,是吧?),ISomeInterface 等)

关于c# - 值类型何时存储在堆栈中(C#)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18375946/

相关文章:

c# - 如何在动态 `textboxes` 上创建事件

c# - 高效移动文件

c# - Xamarin "GenerateResourceDesigner"任务意外失败,找不到 .dll 文件

c# - 类似于 Mathf.Clamp 函数的东西?

javascript - 在代码隐藏函数刚刚填充文本框后调用 javascript

c# - 如何使用自定义 IHttpModule 和 HttpRequest 过滤器修改 POST 请求?

c# - 动态构建 Linq Lambda 表达式

c# - 使用不同的配置文件多次运行控制台应用程序

c# - 当您需要值类型和继承时

c# - 反射。我们可以使用它实现什么?