Domanda

Qualcuno ha una buona soluzione per una versione C # della macro C ++ __FUNCTION__? Al compilatore non sembra piacere.

È stato utile?

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:

Esistono __LINE__ __FILE__ equivalenti in C #?

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 ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top