可能重复:
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
}
}
然后在这种情况下放置对象的位置..堆栈还是堆? 感谢
答案 0 :(得分:8)
哪个会去堆,哪个会堆叠?为什么?
那里的一切都进入了堆。为什么?因为堆用于存储无法提前确定存储生命周期的数据。在您的示例中,所有内容的生命周期 - 数字,字符串,列表 - 都无法提前知道,因此它们都必须进入堆,以便垃圾收集器可以确定存储何时停止。
何时将int i和DateTime dt视为Value类型并将其置于堆栈中?
它们将始终被视为值类型,因为它们是值类型。也就是说,它们将按值复制,包含自己的值。
它们永远不会被放到堆栈上,因为它们的存储寿命无法提前知道。
如果我有一个接口,那么在这种情况下放置对象的位置...堆栈还是堆?
这个问题没有任何意义。您只有类型,没有对象。你在谈论什么对象?
但答案是一样的:如果提前知道存储的生命周期,那么对象将被放入堆栈;否则,他们将被放在堆上进行垃圾收集。
答案 1 :(得分:6)
所有变量都是引用类型(MyClass
)的成员,因此它们都将在堆上......目前。
然而,正如Eric Lippert所说,堆和堆栈是实现细节。请参阅以下博文:
答案 2 :(得分:0)
我觉得这里出了点问题,你编写的代码不会在堆栈中推送任何变量。堆栈将只保存本地范围或参数中的保持变量(不是所有类型),而不是calss成员。
答案 3 :(得分:-4)
我相信(请纠正我,如果我错了)结构/原语(不包括字符串)在堆栈上分配,而对象(包括泛型)在堆上分配。