使用值类型作为参数时的内存位置方式是什么

时间:2012-04-05 09:53:58

标签: c# memory-management value-type reference-type

我知道值类型和引用类型之间的一般区别,我也知道在引用类型中使用值类型时,此值类型实际上在堆上。

例如:

class ClassA{
   public DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0);
}

何时

ClassA a = new ClassA();

date1在堆上

我的问题是

如果我们将这个date1用作方法中的参数,那么内存位置行为是什么?

public void methodA(DateTime dt)
{
//do sth with the dt
}

调用方法

methodA(new ClassA().date1);

选项1:只复制一个date1引用 选项2:或复制date1数据以运行

更新: 在阅读了“关于价值类型的真相”后,我意识到我的假设存在一些不确定性。至少我应该给出一个类似的上下文。 “在桌面CLR上的C#的Microsoft实现中,当值是局部变量或者不是lambda或匿名方法的封闭局部变量的临时变量时,值类型存储在堆栈中,并且方法体不是一个迭代器块,抖动选择不注册该值。“

UPDATE2 : 我之所以问这个问题的原因是我想了解http://marcgravell.blogspot.co.uk/2011/10/assault-by-gc.html

上的一些代码段
  

将Customer从类更改为结构(仅在此疯狂代码中)

     

将主商店从列表更改为客户[]

     

将子集从List更改为List,特别是   抵消主要客户[]

void SomethingComplex(ref Customer customer) {...}
...
int custIndex = ...
SomethingComplex(ref customers[custIndex]);

1 个答案:

答案 0 :(得分:1)

DateTime是一个值类型,因此该值将在方法调用中复制。