哪些对象将转到Stack以及哪些对象以及为什么?

时间:2010-10-19 12:33:05

标签: c# .net

  

可能重复:
  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视为Value类型并将其置于堆栈

b)如果我有一个接口说

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

    public enum ExcelVersion
    {
        Excel2003, Excel2007
    }
}

然后在这种情况下放置对象的位置..堆栈还是堆? 感谢

4 个答案:

答案 0 :(得分:8)

  

哪个会去堆,哪个会堆叠?为什么?

那里的一切都进入了堆。为什么?因为堆用于存储无法提前确定存储生命周期的数据。在您的示例中,所有内容的生命周期 - 数字,字符串,列表 - 都无法提前知道,因此它们都必须进入堆,以便垃圾收集器可以确定存储何时停止。

  

何时将int i和DateTime dt视为Value类型并将其置于堆栈中?

它们将始终被视为值类型,因为它们是值类型。也就是说,它们将按值复制包含自己的值

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

  

如果我有一个接口,那么在这种情况下放置对象的位置...堆栈还是堆?

这个问题没有任何意义。您只有类型,没有对象。你在谈论什么对象?

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

答案 1 :(得分:6)

所有变量都是引用类型(MyClass)的成员,因此它们都将在堆上......目前。

然而,正如Eric Lippert所说,堆和堆栈是实现细节。请参阅以下博文:

答案 2 :(得分:0)

我觉得这里出了点问题,你编写的代码不会在堆栈中推送任何变量。堆栈将只保存本地范围或参数中的保持变量(不是所有类型),而不是calss成员。

答案 3 :(得分:-4)

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