создается экземпляр второго класса, ссылка на этот второй класс теперь содержится в публичном свойстве. В третьем классе в приватное поле кешируется ссылка из первого класса на второй класс через свойство (где содержится экземпляр класса 2). Теперь если в первом классе заново создать экземпляр второго класса и поместить его в свойство, то в первом классе остается закешированный экземпляр с первого раза! Как сделать, чтобы в закешированных ссылках автоматом обновлялись экземпляры классов на новые?
Звучит немного странно, но как вариант сделать ивенты
Можно погуглить INotifyPropertyChanged
Я немного не так выразился. Сделать то я могу чтобы обновлялось. Но я хочу понять, почему не обновляется экземпляр объекта. Там ведь ссылочный тип.
Я так понял, у тебя есть два класса. Забудем про публичность и приватность для примера: class A{ public C Prop {get; set;} } class B{ public C Prop {get;set;} } И ты пишешь: var a = new A(); A.Prop = new C(); var b = new B(); var b.Prop = a.Prop; a.Prop = new C(); Да?
Проще накидал пример public class ClassTest { public int Num { get; } public ClassTest(int num) { Num = num; } } private ClassTest _classTest; private void StartTest() { ClassTest classTest = new ClassTest(1); _classTest = classTest; Debug.Log($"Value {classTest.Num}, Cached Value {_classTest.Num}"); classTest = new ClassTest(2); //_classTest = classTest; Debug.Log($"Value {classTest.Num}, Cached Value {_classTest.Num}"); }
Так у тебя classTest теперь ссылается на новое значение, а _classTest на старое
Почему так происходит? Ведь классы это ссылочный тип.
classTest и _classTest никак не связаны Изначально они "по совпадению" ссылались на один и тот же объект Потом ты одну ссылку изменил, а другую нет
new ClassTest меняет ссылку, а не меняет содержимое по ссылке
Ну вообще как-то нелогично, тип ссылочный, а получается остается старый экземпляр, вместо того что ссылаться на первоисточник ссылки. По логике заменив который новым экземляром, все закешированные ссылки должны указывать на него.
Тут будто бы ты ожидаешь, что вторая переменная будет вести себя не как указатель, а как указатель на указатель
А такое невозможно?
Только если через небезопасный код. Или самому обертку написать, которая будет вести себя как указатель на указатель
Обсуждают сегодня