Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Все еще непонятно, правда, почему при запуске в VS всегда работает.Вы открыли для себя оптимизатор.
var sa = new A();
var wa = new WeakReference<A>(new A());
Видимо имелось ввиду new WeakReference<A>(sa)void M(A a) {
f(a);
g();
}
Здесь существует аргумент-ссылка на инстанс класса А, который передается в функцию f, которая сохраняет исключительно слабую ссылку, и функция g, которая использует эту слабую ссылку. Кроме самой переменной-аргумента «сильных» ссылок на инстанс нет.void M(A a) {
f(a);
g();
GC.KeepAlive(a);
}
То есть, как только в методе выше завершится вызов функции f инстанс класса может быть уничтожен
M(new A()). А учитывая, что в примере автора вообще Tail Call, оптимизация которого скорее всего отключается при запуске из-под дебаггера, там вообще что угодно могло произойти.sa существует до конца метода. В моем представлении, объект, на который она ссылается тоже должен был бы существовать до конца метода.ExternallyControlledLifetimeManager, другие life time менеджеры их не используют, но в том месте, контейнер короткоживущий, поэтому отдавать ему возможность управлять временем жизни объектов было не нужно.
Про Garbage Collector, Unity и слабые ссылки