Когда я компилирую выражение в исполняемый код и получаю делегат - не получается ли код получить мусор, когда больше ссылок на этот делегат не существует?
Есть ли какие-либо документы по этому поводу? Потому что я не нашел ничего полезного в MSDN.
Ответ 1
Да, код может быть собран в мусор. Когда вы вызываете компиляцию на выражение T, код компилируется в DynamicMethod, и они имеют право на сбор мусора.
В действительности это не указано в MSDN, но вы можете взглянуть на реализацию Expression <T> .Compile в DLR, что является чем-то .NET 4.0:
Хотя реализация компилятора была различной в .net 3.5, DynamicMethods все еще использовались (источник: я сам, я реализовал System.Linq.Expressions в Mono).
Случай, когда скомпилированные деревья выражений не собираются, заключается в использовании Expression <T> CompileToMethod и что вы передаете MethodBuilder из AssemblyBuilder, который не был создан с флагом RunAndCollect.