2012-04-25 14 views
6

Estoy escribiendo un juego usando C# y encontré varios casos en los que una función toma un delegado e inadvertidamente he pasado el nombre de una función en lugar de crear y almacenar en caché un delegado para usar como parámetro en su lugar. Esto hace que se cree un objeto delegado para cada llamada a estas funciones, que de inmediato se convierte en basura cuando la función regresa.¿Cómo evitar o detectar la inferencia de delegado implícita en C#?

Me gustaría encontrar todos los lugares donde cometí este error, y preferiría evitar leer cada línea de cada archivo que los busca (hay años de código). Vi cómo VB tiene una 'opción estricta' que desactivará la construcción implícita de objetos que creo que me funcionaría si C# tuviera esa característica, pero no creo que lo haga. También revisé las opciones de advertencia del compilador y ninguna de ellas parece ser útil aquí.

¿Hay alguna manera razonablemente conveniente de identificar estos objetos creados por la inferencia de delegado implícita para poder averiguar dónde debo crear/almacenar en caché las devoluciones de llamada para evitar la basura?

+1

¿Hay algunos ejemplos de código que se puede brindar donde, por ejemplo, un estudio de búsqueda de expresiones regulares visual podría encontrarlos? – mellamokb

+0

La única forma que veo si encuentro el método/función que acepta un delegado, luego haga clic con el botón derecho en> buscar referencias (aunque esto implica verificar manualmente cada llamada). –

+1

¿Tiene alguna evidencia de que esto * realmente * le esté causando un problema? Esperaría que, en la gran mayoría de las ocasiones, la desventaja de rendimiento sea insignificante en comparación con el beneficio de legibilidad de utilizar una conversión de grupo de métodos en lugar de caché explícito. –

Respuesta

10

En resumen, su pregunta es "¿cómo puedo encontrar todas las conversiones de grupos de métodos?"

Actualmente estamos trabajando en un proyecto con nombre en código Roslyn que le permitirá utilizar el mismo motor de análisis semántico que utiliza el compilador C# e IDE. Expondrá el modelo sintáctico del lenguaje, y luego proporcionará una API de análisis semántico mediante la cual puede hacer preguntas sobre el analizador semántico.

Con Roslyn puedes compilar todo tu código en árboles de sintaxis y luego buscar esos árboles de sintaxis para cada expresión. Habrá una API que le permite determinar si la expresión se convirtió en algo y, de ser así, cómo el analizador de conversiones clasificó la conversión.

Estamos en la etapa de "vista previa de la tecnología de la comunidad"; tenemos una implementación preliminar, pero aún no está completamente presentada. No recuerdo si el analizador de conversión de grupos de métodos se implementó en la versión de CTP o no.

Pruébela, y si tiene comentarios al respecto nos encantaría escuchar sus opiniones en el foro de Roslyn.

Detalles aquí:

http://msdn.microsoft.com/en-us/roslyn

+0

Gracias, he estado esperando el proyecto Roslyn por una serie de razones, lo agregaré a la lista de cosas para ver cuando puedo pasar algo de tiempo con él. –

Cuestiones relacionadas