Hoy estaba agregando Log4net a un proyecto y, por primera vez, decidí comprobar cada llamada al logger con IsDebugEnabled, IsInfoEnabled, etc. Esto es muy útil para optimizar el código y no construir strings innecesarios. Por ejemplo, esta expresión:
logger.Debug ("Ejecutando función de " + nombreX + " con parámetro " + z);
En este caso, la concatenación de strings se realizará antes de llamar al método. Si el debug está desactivado, estaremos concatenando strings por las puras. Para corregir esto, podemos comprobar antes que el debug esté activado, así:
if (logger.IsDebugEnabled) logger.Debug ("Ejecutando función de " + nombreX + " con parámetro " + z);
Pero es bastante tedioso y repetitivo. Una solución sería que en vez de enviar strings concatenados, enviáramos la expresión. Esto se puede hacer con expresiones lambda (closures o métodos anónimos). Podríamos definir ILog.Debug así:
public delegate string CreateString ();
void Debug (CreateString create);
De este modo, el método Debug sería el encargado de verificar si el debug está habilitado y, sólo en ese caso, llamaría a la expresión para concatenar el texto. Podríamos llamar a este método de esta forma:
logger.Debug (delegate { return "Ejecutando función de " + nombreX + " con parámetro " + z; });
El problema es que aquí también agregamos demasiado código para ser una expresión simple. Lo ideal, para mí, sería hacer una llamada como esta:
logger.Debug ( { "Ejecutando función de " + nombreX + " con parámetro " + z); } );
Sería lo más simple. Al agregar las llaves "{ }", estaríamos diciéndole al compilador que queremos usar un método anónimo. Aquí nos evitaríamos usar tanto "delegate" como "return", que son palabras clave obvias en este caso.