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

标签 c# performance logging windows-phone-7

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

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

我不想:

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

在我看来,在发布版本中,我只是返回 NullLoggers,它包含一个空的接口(interface)实现,什么都不做。

问题是:编译器是否可以识别这些东西(可能很难,他无法在编译时知道我分配了哪个记录器)。有什么方法可以为 .NET 提供提示吗?

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

还是我想多了一个小问题(也许“字符串 - 代码”比率在我的代码编辑器中看起来很糟糕,但它没什么大不了的)。

谢谢你的提示,
克里斯

最佳答案

使用 Conditional attribute :

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

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

关于c# - ILogger _logger.Debug ("Something") - 编译器有什么方法可以删除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4233880/

相关文章:

c# - 如何在 Entity Framework 中进行正确的左连接

java - Tomcat 在一台普通服务器上每秒可以处理多少个请求?

c# - 使用 BlockingCollection<T>() 缩放连接

javascript - 优先加载图像的幻灯片放映

c# - 如何在 .net 核心 JwtBearerOptions.Events 中使用依赖注入(inject)?

mysql - 带前滚日志的增量备份 : How to get the logs with MySQL commands?

c# - Javascript 确认或其他类型的确认

c# - ViewModel 应该直接引用 View 对象吗?

c# - 在哪里保存应用程序日志?

c# - 我可以使用其他类的函数作为委托(delegate)吗?