2011-03-17 6 views

Respuesta

11

Sí, el código puede ser basura recolectada. Cuando llama a Compilar en una expresión de T, el código se compila en un DynamicMethod, y esos son elegibles para la recolección de basura.

De hecho no se indica en la MSDN, pero se puede echar un vistazo a la puesta en práctica de Expresión <T> .Compile en el DLR, que es lo .net 4.0 incluye:

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

Aunque la implementación del compilador era diferente en .net 3.5, todavía se usaban DynamicMethods (fuente: yo mismo, implementé System.Linq.Expressions en Mono).

El caso en el que los árboles de expresión compilados no son de colección, es cuando se utiliza Expression<T>CompileToMethod, y que se pasa un MethodBuilder de un AssemblyBuilder que no fue creado con la bandera RunAndCollect.

+0

¿Está usando DynamicMethod suficiente? De acuerdo con el enlace proporcionado por Eric, http://msdn.microsoft.com/en-us/library/dd554932.aspx, el ensamblaje debe crearse con un indicador especial. En el reflector puedo ver que el método DynamicMethod.GetDynamicMethodsModule() no crea un ensamblaje con RunAndCollect, sino solo con Run. – Alex

+0

Sí, un DynamicMethod es suficiente, y eso está indicado en MSDN. Los DynamicMethods tienen un manejo especial en el CLR, y de hecho son coleccionables. –

+0

Sí, puedo verlo ahora en la documentación de la clase DynamicMethod. Gracias :) – Alex

Cuestiones relacionadas