C#是否仅在分配给另一个字段时复制字段数据或引用数据?

时间:2010-01-16 21:34:05

标签: c# data-members

在将一个字段分配给另一个字段时,C#是仅复制数据还是实际创建链接? 在this文章中有一个游戏引擎结构的例子。那里的编码器包含其父组件。在C#中,它们只包含父副本,还是引用它?

示例代码:

class World
{
    ...
    public void Update()
    {
        ...
        ent.OnAttach(this);
        ...
    }
    ...
}

class Entity
{
    ...
    public void OnAttach(World world)
    {
        world_ = world;
    }
    ...
}

Entity对象现在可以访问World对象并且可以访问它的字段和方法,就像在artice中一样吗? (或者我误解了代码?)

4 个答案:

答案 0 :(得分:6)

因为您的数据类型World被定义为class而不是struct,这意味着当您分配该类型的变量时,只有引用复制相同的数据。

在其他情况下,无论您是使用world.SomeProperty = something还是world_.someProperty = something,他们都会在内存中编辑同一个对象。

如果您将数据类型更改为struct,则将复制整个数据结构,并且您将拥有相同数据的两个副本。

无论您如何定义数据,一旦您拥有对数据的引用,您就可以访问其方法或属性。所以,是的,一旦您的Entity对象具有对world对象的引用,它就可以访问它上面的任何方法或属性(只要它们不是私有的)。

答案 1 :(得分:4)

取决于World类型。如果它是引用类型(类),则复制的引用将指向同一对象,因此更改新引用所指向的对象将影响原始对象(不会创建新对象)。发布的样本就是这种情况。该字段将简单地引用相同的World对象。

如果World类型是值类型,则将其复制(及其内容)并将成为完全不同的值,更改不会影响原始值。

答案 2 :(得分:3)

As Entity&世界是阶级(即“参考类型”),那么它们只会相互引用。如果一个是结构(即“值类型”),那么将复制enite事物。

答案 3 :(得分:2)

你应该看看通过引用传递和传递值。您的World对象是通过引用传递的,因此您将引用内存中此对象包含的数据所在的位置。

实体现在只能访问World对象的公共方法属性。

相关问题