Выражение <TDelegate>. Компиляция и сборка мусора - PullRequest
11 голосов
/ 17 марта 2011

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

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

1 Ответ

11 голосов
/ 17 марта 2011

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

На самом деле это не указано в MSDN, но вы можете взглянуть на реализацию Expression .Compile в DLR, которая поставляется с .net 4.0:

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

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

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

...