代码之家  ›  专栏  ›  技术社区  ›  user372724

哪些对象将被堆栈,哪些对象将被堆栈,为什么?[副本]

  •  4
  • user372724  · 技术社区  · 14 年前

    可能重复:
    How does .net managed memory handle value types inside objects?

    public class MyClass
    {
    
      public List<RequestRow> RequestRow { get; set; } 
      public List<int> intList { get; set; } 
      public string ErrorMessage { get; set; }
      public string SuccessMessage { get; set; }
    
      int i;
      DateTime dt = DataTime.Now;
    
      public void SomeMethod()
      {
             //some operation
      }
    }
    

    问题是哪一个要堆,哪一个要堆?为什么呢?

    意味着MyClass、属性、字段和方法将转到..堆或堆栈的位置?

    最近我在一次采访中发现了这个问题,很想知道

    编辑

    我喜欢约翰先生的回答,我的疑虑已经消除了。。

    a) 何时将int i和DateTime dt视为值类型并放入堆栈

    b) 如果我有接口的话

    namespace namespace1
    {
        public interface IXLView
        {
            ExcelXP.Application ExcelApp { get; }
            ExcelXP.Workbook CurrentWorkBook { get; }
            ExcelVersion ExcelVersion { get; }       
        }
    
        public enum ExcelVersion
        {
            Excel2003, Excel2007
        }
    }
    

    那么在这种情况下,对象将放在哪里..堆栈还是堆?

    4 回复  |  直到 8 年前
        1
  •  8
  •   Eric Lippert    14 年前

    哪个要堆,哪个要堆?为什么呢?

    堆用于存储无法提前确定存储寿命的数据 . 在您的示例中,无法提前知道所有内容(数字、字符串、列表)的生存期,因此它们都必须进入堆中,以便垃圾收集器可以确定该存储何时停止。

    何时将int i和DateTime dt视为值类型并放入堆栈?

    按值复制 包含自己的价值观

    它们永远不会被放到堆栈上,因为它们的存储寿命无法提前知道。

    如果我有一个接口,那么在这种情况下,对象将放在哪里。。。堆还是堆?

    这个问题毫无意义。你只有 类型 物体 . 你在说什么东西?

    但答案是一样的:如果提前知道存储的生命周期,对象将被放在堆栈上;否则,它们将被放在堆上进行垃圾收集。

        2
  •  6
  •   Jon Skeet    14 年前

    所有变量都是引用类型的成员( MyClass ),所以他们都会在堆里。。。目前。

    然而,正如Eric Lippert喜欢说的,堆和堆栈是实现细节。查看以下博客文章:

        3
  •  0
  •   Neowizard    14 年前

    我想这里有点问题,你写的代码不会把任何变量推到堆栈上。堆栈将只在本地作用域或参数中保存变量(不是所有类型),而不是calss成员。

        4
  •  -4
  •   Richard J. Ross III    14 年前

    我相信(如果我错了,请纠正我)结构/原语(不包括字符串)是在堆栈上分配的,而对象(包括泛型)是在堆上分配的。