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替换编译器指令。