C# просто копирует данные поля при назначении другому полю или ссылается на данные?
-
21-09-2019 - |
Вопрос
При назначении одного поля другому C# просто копирует данные или фактически создает ссылку?В этот В статье приведен пример структуры игрового движка.У кодера есть компоненты, содержащие своего родителя.В C# они содержат только родительскую копию или ссылаются на нее?
Пример кода:
class World
{
...
public void Update()
{
...
ent.OnAttach(this);
...
}
...
}
class Entity
{
...
public void OnAttach(World world)
{
world_ = world;
}
...
}
Может ли объект Entity теперь получить доступ к объекту World и иметь доступ к его полям и методам, как в статье?(или я неправильно понял код?)
Решение
Поскольку ваш тип данных World
определяется как class
и не struct
это означает, что когда вы назначаете переменную этого типа, только ссылка в те же данные копируются.
Другими словами, используете ли вы тогда world.SomeProperty = something
или world_.someProperty = something
они будут редактировать один и тот же объект в памяти.
Если вы измените тип данных на struct
тогда вся структура данных будет скопирована, и у вас будет две копии одних и тех же данных.
Независимо от того, как вы определили свои данные, как только у вас появится ссылка на данные, вы сможете получить доступ к их методам или свойствам.Итак, да, как только ваш объект Entity имеет ссылку на объект world, он может получить доступ к любым его методам или свойствам (если они не являются частными).
Другие советы
Это зависит от World
тип.Если это ссылочный тип (класс), скопированная ссылка будет указывать на тот же объект, и, таким образом, изменение объекта, на который указывает новая ссылка, повлияет на исходный объект (новый объект не создается).Именно так обстоит дело в опубликованном образце.Поле будет просто относиться к тому же самому World
объект.
Если World
type — это тип значения, он копируется (вместе со своим содержимым) и становится совершенно отдельным значением, изменение которого не повлияет на оригинал.
Поскольку Entity и World являются классами (т.е.«ссылочные типы»), то они будут просто ссылаться друг на друга.Если бы это была структура (т.е.«тип значения»), то будет скопирована целая вещь.
Вам следует взглянуть на передачу по ссылке и передачу по значению.Ваш объект World передается по ссылке, поэтому вы передаете ссылку на место в памяти, где находятся данные, содержащиеся в этом объекте.
Теперь сущность могла получить доступ только к общедоступным методам и свойствам объекта World.