有没有一种方法可以在不定义DEBUG
的情况下,在发布版本中使用Debug.WriteLine
?
不。如果您没有定义DEBUG
预处理器符号,则由于应用了[Conditional("DEBUG")]
特性,编译器将删除任何对Debug.*
的调用。
您可能想考虑使用Trace.WriteLine
或其他日志记录技术。
虽然你仍然必须定义DEBUG - 但不需要在整个程序集中都这么做。你只需要在需要的源文件中定义即可。因此,如果你想从特定类中进行调试记录,只需为该源文件定义DEBUG即可。
#define DEBUG
using System.Diagnostics;
...
class Logger
{
void Log( string msg ){ Debug.WriteLine( msg ); }
}
是的。您可以使用TRACE,如上面的评论中所述,或者通过使用表达式树而不定义任何编译时常量。
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();
在此之后,您可以通过调用Debug.WriteLine随时调用它。
compiledAction("Debug text");
如果你感兴趣,可以在这里查看源代码:https://github.com/prasannavl/SharpLog/blob/master/SharpLog/DebugLogger.cs
Debug.WriteLine
或编译后的Lambda都没有区别,后者几乎相当于(() => Debug.WriteLine())
,只是没有JIT优化。 - user3513472Debugger.Log(0, null, "Your string here");
可以作为一种替代方案,它在Debug.Write
内部使用,并且在Release模式下也能正常工作。