【问题标题】:where will the class be stored if it has a struct variable?如果类具有结构变量,该类将存储在哪里?
【发布时间】:2013-12-27 17:23:39
【问题描述】:

很明显since the structs are value types in c#, they are stored on stacka class object is stored on the heap(它的引用,当然存储在堆栈中)。

警告:(是的,这可能并不总是正确的。感谢@Jon 的纠正)但在大多数情况下,是的!

但是,a class one of whose member is of type struct 呢?现在,内存模型将如何?

顺便说一句,我如何检查某个对象是否位于 stackheap 中?

好的。一些假设:

  1. 此类在函数内部是本地的。
  2. 结构是member 而不是variable。 (感谢更正。)

【问题讨论】:

  • 这有关系吗?它可能不像你想象的那么清晰......在这里查看 Eric 的 cmets:blogs.msdn.com/b/ericlippert/archive/2009/04/27/…
  • “很明显,由于结构是 c# 中的值类型,因此它们存储在堆栈中” - 这是一个不正确的陈述,正是您给出的示例。
  • @JonSkeet:更正:)
  • 我猜测实际的内存模型更复杂,但从逻辑上讲,所有类都由某种级别的值类型组成(如果它们有状态)。正如您所说,类存储在堆上。
  • 类本身没有变量。它们的成员可以是字段、方法、属性、事件等。方法有变量。

标签: c# .net c#-4.0


【解决方案1】:

类本身将是一个引用类型,因此它的实例将保存在堆上。

struct 的属性是实例(即对象)的组成部分,因此也将保留在堆中,就像该对象的 intenum 属性一样.

注意:不会引用 struct 属性,就像没有引用 intenum 属性一样。

【讨论】:

  • 谢谢罗伊。另外,当人们说it will be stored on heapit will be stored on stack 时,我该如何验证呢?如何actually see what is stored where
  • 我不确定您是否可以查看单个分配,但是当您使用内存分析器时,您至少应该能够监控托管堆的增长。
【解决方案2】:

已经很清楚,由于结构是 c# 中的值类型,它们 存储在堆栈中,而类对象存储在堆中(它的 参考,当然存储在堆栈上)。

这个假设是不正确的。 值类型仅在它们是 本地 变量且不属于闭包/lambda/匿名方法的一部分时才会进入堆栈。即使这样,如果抖动决定将它们放在堆上。

但是,变量是结构类型的类呢?现在, 内存模型如何?

上面的规则应该回答了你的问题:因为一个值类型只能存储在堆栈中,如果它是一个局部变量,那么一个类的字段必须放在堆上。

您需要了解的有关值类型的所有信息: http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 2015-02-13
    • 2016-04-26
    • 1970-01-01
    • 2017-03-26
    • 2010-10-02
    相关资源
    最近更新 更多