Question

Quelqu'un at-il une bonne solution pour une version C # de la macro C ++ __FUNCTION__? Le compilateur ne semble pas l’aimer.

Était-ce utile?

La solution

Essayez d’utiliser ceci à la place.

System.Reflection.MethodBase.GetCurrentMethod().Name

C # n'a pas de macros __ LINE __ ou __ FUNCTION __ similaires à C ++, mais il existe des équivalents

Autres conseils

Ce que j'utilise actuellement est une fonction comme celle-ci:

using System.Diagnostics;

public string __Function() {
    StackTrace stackTrace = new StackTrace();
    return stackTrace.GetFrame(1).GetMethod().Name;
}

Lorsque j'ai besoin de __FUNCTION__, j'appelle simplement __Function (). Par exemple:

Debug.Assert(false, __Function() + ": Unhandled option");

Bien sûr, cette solution utilise également la réflexion, mais c’est la meilleure option que je puisse trouver. Comme je ne l’utilise que pour le débogage (et non pour le traçage dans les versions finales), l’atteinte à la performance n’est pas importante.

Je suppose que ce que je devrais faire, c'est créer des fonctions de débogage et les étiqueter avec

[ Conditional("Debug") ]

à la place, mais je n'ai pas eu le temps de le faire.

Merci à Jeff Mastry pour sa solution à ce problème.

Malheureusement, il n’existe pas de version équivalente de cette macro en C #. Je ne considère pas que la solution GetCurrentMethodName () soit équivalente à la macro C ++ __FUNCTION__. En effet, la version C ++ est un calcul du nom à la compilation. Pour C #, il s’agit d’un calcul d’exécution qui se traduit par une baisse des performances.

Je ne fais aucune hypothèse sur la gravité du coût, mais il y en a un

Ce qui suit devrait fonctionner, même s'il sera évalué à l'exécution plutôt qu'à la compilation.

System.Reflection.MethodBase.GetCurrentMethod().Name

Ceci est ajouté dans .NET 4.5.

Voir la réponse de @ roken ici:

Des équivalents __LINE__ __FILE__ existent-ils en C #?

J'utilise ceci:

public static string CallerName([CallerMemberName] string callerName = "")
{
    return callerName;
}

Exemple d'utilisation:

s_log.DebugFormat("{0}", CallerName());

L’inconvénient de son utilisation est que chaque fois que vous souhaitez imprimer le nom de l’appelant, vous devez accéder à la fonction == > fastidieux & amp; succès de la performance! Donc, je l’utilise pour le débogage et si j’ai besoin d’imprimer aussi dans le code de production, j’insère généralement le nom de la fonction dans le log.Debug, par exemple. :

s_log.Debug("CallerName");

HTH ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top