2012-04-17 23 views
34

Tengo una biblioteca de clases y estoy usando solo una parte. ¿Existe la necesidad de eliminar lo que no se usa para reducir el tamaño del código creado (en la configuración de lanzamiento)?¿El compilador solo compilará el código que se puede ejecutar?

Por lo que he visto, el compilador se encarga de eso, y la eliminación del código no cambia el tamaño del archivo EXE. ¿Esto siempre será cierto? Eliminar todo el código innecesario llevaría mucho tiempo, por lo que quiero saber si es necesario.

Más información: hay métodos y clases en la biblioteca de clases que no son llamados desde el código de ejecución, pero son referenciados por otras partes de código en la biblioteca de clase (que nunca se llaman).

+3

Siempre puede tomar el reflector .NET y ver exactamente qué está incluido en el archivo DLL "liberado". La mejor forma de aprender es experimentar (o al menos ha sido mi experiencia) –

+3

¿El compilador va a poder decirle que nunca distribuirá esa DLL a alguien que pueda intentar usar ese código? –

+1

@AnthonyPegram La biblioteca no se compila por separado. Tengo el código fuente en mi proyecto. – ispiro

Respuesta

34

No, el compilador también incluye el código "muerto". Una razón simple para esto es que no siempre es posible saber exactamente qué código se ejecutará o no. Por ejemplo, incluso un método privado al que nunca se hace referencia se puede llamar mediante reflexión, y los ensambles externos pueden hacer referencia a los métodos públicos.

Puede usar una herramienta para ayudarlo a encontrar y eliminar métodos no utilizados (incluidos los que solo se invocan mediante otros métodos no utilizados). Pruebe What tools and techniques do you use to find dead code? y Find unused code para comenzar.

0

Dudo que el compilador elimine nada. El hecho es que el compilador no puede decir qué se usa y qué no, ya que los tipos se pueden instanciar y los métodos se llaman por nombre, gracias a la reflexión.

6

Todo se compila. Independientemente de si se llama o no. El código puede ser llamado por una biblioteca externa.

La única manera de hacer que el compilador ignore el código es mediante el uso de Directivas de preprocesador de compilador. Más acerca de esos here.

+0

Solo puede ser llamado por una biblioteca externa si es público o un miembro protegido de una clase pública. –

0

Supongamos que hay una biblioteca de clases llamada Utility. Usted creó un nuevo proyecto y agregó esta biblioteca de clase a ese proyecto. Incluso si su EXE llama solo a 1-2 métodos de la biblioteca de la clase, nunca es una buena idea eliminar el código sin referencia.

Iría en contra del principio de reusablity. A pesar del hecho de que habría algunas clases presentes en la biblioteca sin referencia del EXE, no tendría ningún impacto negativo en el rendimiento o el tamaño del programa.

0

Determinar todo y solo el código muerto es (si uno hace la idealización de que uno tiene un lenguaje de "mundo matemático") recursivamente indecidible, en la mayoría de los idiomas. (Algunos pocos raros como el lenguaje Blaise son decidibles.)

Cuestiones relacionadas