Versione C # della macro __FUNCTION__
Domanda
Qualcuno ha una buona soluzione per una versione C # della macro C ++ __FUNCTION__? Al compilatore non sembra piacere.
Soluzione
Prova invece a usarlo.
System.Reflection.MethodBase.GetCurrentMethod().Name
C # non ha __LINE__
o __FUNCTION__
macro come C ++ ma ci sono equivalenti
Altri suggerimenti
Quello che attualmente uso è una funzione come questa:
using System.Diagnostics;
public string __Function() {
StackTrace stackTrace = new StackTrace();
return stackTrace.GetFrame(1).GetMethod().Name;
}
Quando ho bisogno di __FUNCTION__, chiamo invece __Function (). Ad esempio:
Debug.Assert(false, __Function() + ": Unhandled option");
Naturalmente questa soluzione usa anche la riflessione, ma è l'opzione migliore che posso trovare. Dal momento che lo uso solo per il debug (non per tracciare nelle build di rilascio), l'hit performance non è importante.
Immagino che cosa dovrei fare è creare funzioni di debug e contrassegnarle con
[ Conditional("Debug") ]
invece, ma non ci sono riuscito.
Grazie a Jeff Mastry per la sua soluzione a questo.
Sfortunatamente non esiste una versione equivalente di quella macro in C #. Non considero la soluzione GetCurrentMethodName () equivalente alla macro C ++ __FUNCTION__. Vale a dire che la versione C ++ è un calcolo del tempo di compilazione del nome. Per C # questo è un calcolo di runtime e comporta un hit di prestazione.
Non sto assumendo alcuna ipotesi sulla gravità del costo, ma ce n'è una
Quanto segue dovrebbe funzionare, anche se verrà valutato in fase di esecuzione anziché durante la compilazione.
System.Reflection.MethodBase.GetCurrentMethod().Name
Questo è stato aggiunto in .NET 4.5.
Vedi la risposta di @ roken qui:
Uso questo:
public static string CallerName([CallerMemberName] string callerName = "")
{
return callerName;
}
Esempio di utilizzo:
s_log.DebugFormat("{0}", CallerName());
Il lato negativo dell'utilizzo è che ogni volta che si desidera stampare il nome del chiamante, è necessario passare alla funzione == > che richiede tempo & amp; colpo di prestazione! Quindi, lo uso per il debugging perpose e se devo stampare anche nel codice di produzione, di solito inserisco il nome della funzione nel log. Debug, ad es. :
s_log.Debug("CallerName");
HTH ..