C# 日志记录和调试消息
打印以下消息时,我让调试消息评估昂贵的字符串操作:C# 日志记录和调试消息,c#,visual-studio,C#,Visual Studio,打印以下消息时,我让调试消息评估昂贵的字符串操作: LogDebug(()=>"Here it is: "+obj.ExpensiveToString()); Log.Debug(“在这里”+obj.ExpensiveToString()) 现在,即使日志级别没有设置为Debug,它仍然会评估昂贵的字符串操作 因此,不必这样做: if(debugMode)Log.Debug(“这里是”+obj.ExpensiveToString()) 或者有很多复杂的Log.Debug()方法,我该如何
LogDebug(()=>"Here it is: "+obj.ExpensiveToString());
Log.Debug(“在这里”+obj.ExpensiveToString())
现在,即使日志级别没有设置为Debug
,它仍然会评估昂贵的字符串操作
因此,不必这样做:
if(debugMode)Log.Debug(“这里是”+obj.ExpensiveToString())
或者有很多复杂的
Log.Debug()
方法,我该如何解决这个问题呢?使用编译器指令
#if DEBUG
Log.Debug("Here it is: "+obj.ExpensiveToString());
#endif
因为这些指令增加了代码的冗长性,所以将它们用于昂贵的部分
另一种选择是修改或补充日志系统以接受Func
使用编译器指令
#if DEBUG
Log.Debug("Here it is: "+obj.ExpensiveToString());
#endif
因为这些指令增加了代码的冗长性,所以将它们用于昂贵的部分
另一种选择是修改或补充日志系统以接受Func
如果您使用的是log4net,那么最好将该标记添加到您的问题中。专家会更快地注意到它。我认为无论配置如何,它都会对该表达式求值,因为obj.ExpensiveToString()作为函数的参数,必须求值才能调用函数。他们只能在函数内部检查配置call@Steve我没有使用log4net@sumeetkumar-那不是真的。如果
debugMode
为false,它甚至不会尝试计算Log.Debug()
函数。如果编译器知道该调用,例如Trace和Debug.WriteLine,则可能会写入。但在任何其他情况下,它都会将其视为通用方法并执行它,除非您将预定义的指令设置为建议答案。如果您使用的是log4net,最好将该标记添加到您的问题中。专家会更快地注意到它。我认为无论配置如何,它都会对该表达式求值,因为obj.ExpensiveToString()作为函数的参数,必须求值才能调用函数。他们只能在函数内部检查配置call@Steve我没有使用log4net@sumeetkumar-那不是真的。如果debugMode
为false,它甚至不会尝试计算Log.Debug()
函数。如果编译器知道该调用,例如Trace和Debug.WriteLine,则可能会写入。但在任何其他情况下,它都会将其视为通用方法并执行,除非您将预定义的指令设置为建议答案。这是一个有趣的解决方案,但肯定Fun
会增加其自身的开销?Func将仅作为编译运行时代码的“指针”携带,不会在调试模式下对其进行评估,因此,开销非常小,与任何其他类型的传递参数相称。例如,添加if(debugMode)
可能有点慢。我们不喜欢编译器指令的想法。这意味着您不能仅通过编辑配置文件来更改日志记录级别,而必须提供新的调试版本。使用函数参数,您可以使用if(debugMode)
check替换编译器指令。这是一个有趣的解决方案,但是,当然,<代码> Fux会增加它自己的开销吗?FUNC只会作为一个“指针”被带到编译的运行时的代码中,它不会在调试模式下被评估,所以开销非常小,与任何其他类型的传递参数相称。例如,添加if(debugMode)
可能有点慢。我们不喜欢编译器指令的想法。这意味着您不能仅通过编辑配置文件来更改日志记录级别,而必须提供新的调试版本。使用函数参数,您可以使用if(debugMode)
check替换编译器指令。