C # просто копирует данные поля при присвоении другому полю или ссылается на данные? - PullRequest
3 голосов
/ 17 января 2010

При присвоении одного поля другому, C # просто копирует данные или создает ссылку? В этой статье приведен пример структуры игрового движка. Кодер там имеет компоненты, содержащие их родительский. В C # они просто содержат родительскую копию или ссылаются на нее?

Пример кода:

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

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

Может ли объект Entity теперь обращаться к объекту World и иметь доступ к его полям и методам, как в artice? (или я неправильно понял код?)

Ответы [ 4 ]

6 голосов
/ 17 января 2010

Поскольку ваш тип данных World определяется как class, а не struct, это означает, что при назначении переменной этого типа копируется только ссылка на те же данные .

В других случаях, используете ли вы затем world.SomeProperty = something или world_.someProperty = something, они будут редактировать один и тот же объект в памяти.

Если вы измените тип данных на struct, тогда будет скопирована вся структура данных, и у вас будет две копии одинаковых данных.

Независимо от того, как вы определили свои данные, если у вас есть ссылка на данные, вы можете получить доступ к их методам или свойствам. Итак, да, когда ваш объект Entity имеет ссылку на объект world, он может получить доступ к любым методам или свойствам (если они не являются частными).

4 голосов
/ 17 января 2010

Это зависит от типа World. Если это ссылочный тип (класс), скопированная ссылка будет указывать на тот же объект, и, следовательно, изменение объекта, на который указывает новая ссылка, повлияет на исходный объект (новый объект не создается). Это случай в размещенном образце. Поле будет просто ссылаться на тот же World объект.

Если тип World является типом значения, он копируется (вместе с его содержимым) и становится совершенно отдельным значением, изменение которого не повлияет на оригинал.

3 голосов
/ 17 января 2010

Поскольку Entity & World являются классом (т. Е. "Ссылочными типами"), тогда они просто будут иметь ссылки друг на друга. Если бы вы были структурой (то есть «типом значения»), тогда объект enite был бы скопирован.

2 голосов
/ 17 января 2010

Вы должны взглянуть на передачу по ссылке и передачу по значению. Ваш объект World передается по ссылке, поэтому вы передаете ссылку в область памяти, в которой находятся данные, содержащиеся в этом объекте.

Сущность теперь может получать доступ только к открытым методам, свойствам объекта World.

...