Выражение <TDelegate>. Сбор и сбор мусора

Когда я компилирую выражение в исполняемый код и получаю делегат - не получается ли код получить мусор, когда больше ссылок на этот делегат не существует?

Есть ли какие-либо документы по этому поводу? Потому что я не нашел ничего полезного в MSDN.

Ответ 1

Да, код может быть собран в мусор. Когда вы вызываете компиляцию на выражение T, код компилируется в DynamicMethod, и они имеют право на сбор мусора.

В действительности это не указано в MSDN, но вы можете взглянуть на реализацию Expression <T> .Compile в DLR, что является чем-то .NET 4.0:

http://dlr.codeplex.com/SourceControl/changeset/view/54115#990638

Хотя реализация компилятора была различной в .net 3.5, DynamicMethods все еще использовались (источник: я сам, я реализовал System.Linq.Expressions в Mono).

Случай, когда скомпилированные деревья выражений не собираются, заключается в использовании Expression <T> CompileToMethod и что вы передаете MethodBuilder из AssemblyBuilder, который не был создан с флагом RunAndCollect.