0

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

前任:

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 更改为 Customer[]

将子集从 List 更改为 List,特别是主 Customer[] 的偏移量

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

1 回答 1

1

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

于 2012-04-05T09:58:40.150 回答