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

4 .net c#

可能重复:
.net托管内存如何处理对象内的值类型?

我有一个课程如下

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
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是哪个会堆到哪个堆栈?为什么?

意味着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
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在这种情况下将对象放在哪里..堆栈还是堆? 谢谢

Eri*_*ert 8

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

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

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

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

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

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

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

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


Jon*_*eet 6

你的所有变量都是引用类型(MyClass)的成员,所以它们都会在堆上......目前.

但是,正如Eric Lippert喜欢说的那样,堆和堆栈是实现细节.查看这些博文:

  • @priyanka ... int和DateTime将始终被视为值类型,因为它们就是这样.我认为你仍然将价值类型与堆栈联系起来.阅读博客! (2认同)