2010-01-16 3 views
3

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

Пример кода:

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

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

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

ответ

6

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

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

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

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

+0

Громкий и понятный, красиво объясненный Я получил его при первом легком взгляде! +1, принятый ответ! – Johnny

+0

Другое дело, ссылочный тип все еще работает так же, если он был назначен списку ? Другими словами, изменение объекта Entity повлияет на его часть в списке после добавления его со списком .Add()? – Johnny

+0

Нет, это все равно будет одним и тем же экземпляром объекта. Объект даже не «знает», что он был добавлен в список. – Eilon

4

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

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

+0

Мне стало слишком поздно, чтобы прочитать это перед вторым ответом, второй кажется более ясным, извините, но вы объяснили, что это здорово, спасибо! +1 – Johnny

3

As Entity & Мир - это класс (т. Е. «Ссылочные типы»), тогда они будут иметь только ссылки друг на друга. Если бы кто-то был структурой (т. Е. «Тип значения»), тогда копия была бы скопирована.

2

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

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

+0

Ээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээ, – Johnny

+0

Вы правы, вы можете передать этот объект только по ссылке. –

+0

Хорошо, я просто немного смутился, потому что вы упомянули прохождение по ссылке (связанное с аргументами функции, ключевое слово ref), а не ссылочные типы. В любом случае спасибо за помощь. – Johnny