ILogger _logger.Debug(“Something”) - 编译器有什么方法可以删除它?

时间:2010-11-20 17:01:15

标签: c# performance logging windows-phone-7

我有一个非常常见的场景,即自我实现的ILogger接口。它包含几种方法,如 _logger.Debug(“Some stuff”)等。该实现由LoggingService提供,并以正常方式在类中使用。

现在我有一个关于性能的问题,我正在为Windows Phone 7写作,而且由于这些设备功能有限,很少有事情可能很重要。

我不想:

  • 在每行上包含预编译器指令,例如#IF DEBUG
  • 使用类似log4net的条件,例如_logger.DebugEnabled

我看到它的方式,在发布版本中,我只返回NullLoggers,它包含一个空的接口实现,什么都不做。

问题是:编译器是否识别出这样的事情(可能很难,他在编译时无法知道我分配的记录器)。有没有办法给.NET一个提示呢?

我的问题的原因,我知道进入一个空函数不会造成很大的延迟,没有问题。但是我的应用程序的源代码中有很多字符串,如果它们从未使用过,它们实际上并不需要成为我的应用程序的一部分......

或者我是否过度思考一个小问题(也许“字符串 - 代码”比率在我的代码编辑器中看起来很糟糕,而且无论如何都没什么大不了的。)

感谢您的提示,
克里斯

2 个答案:

答案 0 :(得分:9)

使用Conditional attribute

[Conditional("DEBUG")]
public void Debug(string message) { /* ... */ }

对于与条件属性中的字符串不匹配的任何构建配置,编译器将删除对此方法的所有调用。请注意,此属性适用于方法而不是调用网站。另请注意,删除的是调用站点指令,而不是方法本身。

答案 1 :(得分:1)

在您的应用程序中使用不“运行”的日志记录代码可能是一个非常小的问题。 “null”记录器或条件的开销在事物方案中可能非常小。这些字符串会产生内存开销,这可能会让受限设备感到担忧,但是因为它是WP7,所以最低规格并不是实际受限制的。

我知道日志代码看起来很难看。 :)

如果你真的想要删除那个日志代码......

在.Net中,您可以使用ConditionalAttribute标记条件编译的方法。您可以利用此功能确保从指定的构建配置的编译中删除所有日志记录调用。只要使用条件属性修饰的方法遵循一些规则,编译器就会删除调用链。

但是,如果您想使用此方法,则必须放弃接口设计,因为条件属性不能应用于接口成员,并且您无法实现具有条件成员的接口。