可能重复:
.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)
然后在这种情况下将对象放在哪里..堆栈还是堆? 谢谢
哪个会去堆,哪个堆栈?为什么?
那里的一切都进入了堆.为什么?因为堆用于存储数据,其中无法提前确定存储的生命周期.在您的示例中,所有内容的生命周期 - 数字,字符串,列表 - 都无法提前知道,因此它们都必须进入堆,以便垃圾收集器可以确定存储何时停止.
何时将int i和DateTime dt视为Value类型并将被置于堆栈中?
它们将始终被视为值类型,因为它们是值类型.也就是说,它们将按值复制并包含自己的值.
它们永远不会被放到堆栈中,因为它们的存储寿命无法提前知道.
如果我有一个接口,那么在这种情况下将对象放在哪里...堆栈或堆?
这个问题没有任何意义.你只有类型,没有对象.你在谈论什么对象?
但答案是一样的:如果提前知道存储的生命周期,那么对象将被放在堆栈中; 否则,他们将被放在堆上进行垃圾收集.
你的所有变量都是引用类型(MyClass)的成员,所以它们都会在堆上......目前.
但是,正如Eric Lippert喜欢说的那样,堆和堆栈是实现细节.查看这些博文:
| 归档时间: |
|
| 查看次数: |
3968 次 |
| 最近记录: |