Existe-t-il un moyen d'utiliser Debug.WriteLine
dans une version sans définir DEBUG
?
Non, mais vous pouvez utiliser le Trace
dans la version en définissant TRACE
et en utilisant Trace.WriteLine.
Jetez un œil ici:
https://support.Microsoft.com/en-us/help/815788/how-to-trace-and-debug-in-visual-c
Non. Si vous ne définissez pas le symbole du préprocesseur DEBUG
, tous les appels à Debug.*
Seront supprimés par le compilateur en raison de l'attribut [Conditional("DEBUG")]
appliqué.
Vous voudrez peut-être envisager Trace.WriteLine
ou d'autres techniques de journalisation.
Bien que vous ayez encore à définir DEBUG - vous n'avez pas à le faire à l'échelle de l'assemblage. Vous pouvez le définir uniquement dans les fichiers source que vous souhaitez. Donc, si vous souhaitez déboguer la journalisation à partir d'une classe particulière, vous pouvez définir DEBUG uniquement pour ce fichier source.
#define DEBUG
using System.Diagnostics;
...
class Logger
{
void Log( string msg ){ Debug.WriteLine( msg ); }
}
Oui. Vous pouvez, comme mentionné dans les commentaires ci-dessus, utiliser TRACE, ou sans définir de constantes de temps de compilation, en utilisant des arbres d'expression.
var p = Expression.Parameter(typeof(string), "text");
var callExp =
Expression.Call(
typeof(System.Diagnostics.Debug).GetRuntimeMethod(
"WriteLine", new [] { typeof(string) }),
p);
Action<string> compiledAction = Expression.Lambda<Action<string>>(
callExp, p)
.Compile();
Après cela, vous pouvez appeler le Debug.WriteLine à tout moment, en appelant
compiledAction("Debug text");
Vous trompez essentiellement le compilateur en ne disposant pas d'un appel de méthode statique, mais en le construisant de manière dynamique au moment de l'exécution.
Il n'y a aucun impact sur les performances depuis, l'action est compilée et réutilisée.
C'est ainsi que j'ai écrit un DebugLogger dans SharpLog.
Vous pouvez consulter le code source ici, s'il vous intéresse: https://github.com/prasannavl/SharpLog/blob/master/SharpLog/DebugLogger.cs