Pull to refresh

Comments 2

Замена и возврат идут в одном методе, между ними нет ни выхода, ни вызова сборки мусора. Если оставить объект в таком виде, сборщик мусора прочитает его поля по описанию чужого типа и уронит процесс.

Сборщик мусора следует своими путями, поэтому то, что всё происходит в одном методе без сторонних вызовов, гарантией от вызова GC не является, Так что, если вдруг действительно понадобится подменить тип объекта, лучше явно запретить сборку мусора с помощью TryStartNoGCRegion/EndNoGCRegion.

А ещё лучше IMHO так вообще не делать.

Подменять MethodTable вообще нельзя, это чистой воды UB с разными последствиями. никакой NoGC безопаснее это не сделает. JIT вполне легально предполагает что это часть объекта никогда не меняется и может производить манипуляиции которые сломаются этим.

Sign up to leave a comment.

Articles