关于类中的值类型属性,我对堆栈和堆上发生的事情感到困惑。
到目前为止我的理解:
当您创建具有如下结构(值类型)的类时:
class Foo
{
private Bar _BarStruct;
public Bar BarStruct
{
get {return _BarStruct; }
set {_BarStruct = value; }
}
}
private struct Bar
{
public int Number;
Bar()
{
Number = 1;
}
Bar(int i)
{
Number = i;
}
}
如果你像这样创建一个类实例:
Foo fooObj = new Foo();
堆栈和堆将如下所示:
...其中 Bar 结构嵌入在堆中的 Foo 类中。这对我来说很有意义,但是当我们考虑在 Foo 对象中修改 BarStruct 类中的 Number 整数时,我开始失去它。例如:
Foo fooObj = new Foo();
fooObj.BarStruct.Number = 1;
据我了解,这应该是返回 BarStruct 的副本以存在于堆栈中,这意味着 BarStruct 成员的任何更改都不会传递到对象,这就是上面最后一行给出错误的原因。
到目前为止这是正确的吗?
如果是这样,我的问题是,怎么会有这样的任务:
fooObj.BarStruct = new Bar(2);
...有效并更改堆值?当然这只是改变堆栈上的值?此外,(渐渐地)我发现它非常令人困惑,以至于您可以在值类型上使用 new 。对我来说,new 用于在堆上分配(根据 C++),并且感觉不自然地为堆栈上的项目执行此操作。
因此,只是为了重申这个问题,我是否正确假设调用包含结构的属性时会发生什么,为什么可以将新结构分配给副本,但它仍然会更改堆上的引用?
真的希望这一切都有意义。
如果您需要澄清,请大喊大叫!
塔,
安迪。