Почему переменная ссылочного типа ведет себя как переменная типа значения - PullRequest
0 голосов
/ 16 марта 2020

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

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 для хранения данных. Мой вопрос заключается в том, что я считаю, что, поскольку Weapon является ссылочным типом, при переназначении currentWeapon oldWeapon также должен измениться. Но по какой-то причине назначения, которые я делаю для переменной currentWeapon, не влияют на oldWeapon. Что-то происходит, о чем я не знаю, или я что-то не так понял?

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

1 Ответ

5 голосов
/ 16 марта 2020

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

//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"
...