C# просто копирует данные поля при назначении другому полю или ссылается на данные?

StackOverflow https://stackoverflow.com/questions/2078974

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top