Почему переменная ссылочного типа ведет себя как переменная типа значения

Итак, у меня есть ссылочный тип, который является оружием:

class Weapon
{
    //Some properties that are both value type and reference type
}

И у меня есть еще один класс для хранения массива оружия и запуска события при изменении текущего оружия:

class WeaponManager
{
    Weapon[] weapons;
    Weapon currentWeapon;

    Weapon CurrentWeapon
    {
       get => currentWeapon;
       set
       {
           Weapon oldWeapon = currentWeapon;
           currentWeapon = value;
           OnWeaponChanged?.Invoke(oldWeapon, currentWeapon);
       }
    }
}

Я объявляю переменную oldWeapon и присваиваю ее currentWeapon для хранения данных. Мой вопрос заключается в том, что я считаю, что, поскольку оружие является ссылочным типом, когда я переназначаю текущее оружие, старое оружие также должно измениться. Но по какой-то причине присвоения, которые я делаю для переменной currentWeapon, не влияют на oldWeapon. Есть ли какие-то вещи, о которых я не знаю, или я что-то неправильно понял?

Примечание. Класс оружия является производным от другого класса, в котором есть хотя бы одна строка, но я не уверен, что проблема в этом.


person Community    schedule 15.03.2020    source источник
comment
..когда я переназначаю текущее оружие, старое оружие также должно измениться. Неа. Кроме того, код не показывает никаких изменений, которые я вношу в переменную currentWeapon, поэтому трудно объяснить непоказанное поведение.   -  person user2864740    schedule 16.03.2020
comment
Не могли бы вы объяснить, почему? Под изменениями, которые я вношу в переменную currentWeapon, я имел в виду такие вещи, как переназначение currentWeapon в сеттере. Я редактирую вопрос.   -  person    schedule 16.03.2020
comment
Переменные (имена) независимы от объектов (значения, которые часто могут быть изменены), к которым они относятся / имя. Изменение объекта изменяет этот объект, независимо от имени, используемого для разрешения объекта. В этом случае модификация объекта не отображается.   -  person user2864740    schedule 16.03.2020


Ответы (1)


Происходит что-то, что вы понимаете правильно. Каждая ссылка, которую вы устанавливаете на объект в памяти, является его собственной ссылкой, а не ссылкой на другую ссылку на объект (это не цепочка)

//if you do
currentWeapon = "a sword"
oldWeapon = currentWeapon

//then you have this
oldWeapon --> "a sword" <-- currentWeapon

//you do not have this
oldWeapon  --> currentWeapon --> "a sword"


//if you then do this
currentWeapon = "a gun"

//then you have this
oldWeapon --> "a sword"      currentWeapon --> "a gun"

//you do not have this
oldWeapon  --> currentWeapon --> "a gun"
person Caius Jard    schedule 15.03.2020
comment
Спасибо! Я думал, что это цепная структура. - person ; 16.03.2020