directivas - tag debug c#
VersiĆ³n C#de la macro__FUNCTION__ (6)
¿Alguien tiene una buena solución para una versión C # de la macro C ++ __FUNCTION__? Al compilador no parece gustarle.
Intenta usar esto en su lugar.
System.Reflection.MethodBase.GetCurrentMethod().Name
C # no tiene macros __LINE__
o __FUNCTION__
como C ++, pero hay equivalentes
Lamentablemente, no hay una versión equivalente de esa macro en C #. No considero que la solución GetCurrentMethodName () sea equivalente a la macro C ++ __FUNCTION__. A saber, porque la versión de C ++ es un cálculo en tiempo de compilación del nombre. Para C #, este es un cálculo del tiempo de ejecución e incurre en un golpe de rendimiento.
No estoy suponiendo nada sobre la gravedad del costo, pero hay uno
Lo siguiente debería funcionar, aunque se evaluará en tiempo de ejecución en lugar de durante la compilación.
System.Reflection.MethodBase.GetCurrentMethod().Name
Lo que uso actualmente es una función como esta:
using System.Diagnostics;
public string __Function() {
StackTrace stackTrace = new StackTrace();
return stackTrace.GetFrame(1).GetMethod().Name;
}
Cuando necesito __FUNCTION__, simplemente llamo a la función __Function (). Por ejemplo:
Debug.Assert(false, __Function() + ": Unhandled option");
Por supuesto, esta solución también usa reflexión, pero es la mejor opción que puedo encontrar. Como solo lo uso para depurar (no para rastrear en compilaciones de versiones), el rendimiento no es importante.
Creo que lo que debería hacer es crear funciones de depuración y etiquetarlas con
[ Conditional("Debug") ]
en cambio, pero no he llegado a eso.
Gracias a Jeff Mastry por su solución a esto.
Yo uso esto:
public static string CallerName([CallerMemberName] string callerName = "")
{
return callerName;
}
Ejemplo de uso:
s_log.DebugFormat("{0}", CallerName());
La desventaja de usarlo es que cada vez que desea imprimir el nombre de la persona que llama, debe saltar a la función ==> ¡tiempo y desempeño exitoso! Por lo tanto, lo uso para la depuración y si necesito imprimir también en código de producción, normalmente inserto el nombre de la función en el registro. Debug, por ejemplo:
s_log.Debug("CallerName");
HTH ..
Esto se agrega en .NET 4.5.
Vea la respuesta de @ roken aquí: