C# ILogger.Debug(";Something";)-编译器有没有办法删除它?

C# ILogger.Debug(";Something";)-编译器有没有办法删除它?,c#,performance,logging,windows-phone-7,C#,Performance,Logging,Windows Phone 7,我得到了一个非常常见的场景,即一个自我实现的ILogger接口。它包含几种方法,如\u logger.Debug(“一些东西”)等等。该实现由LoggingService提供,并以正常方式在类中使用 现在我有一个关于性能的问题,我正在为WindowsPhone7撰写文章,由于这些设备的功率有限,一些小事情可能很重要 我不想: 在每一行中包含一个预编译器指令,如#IF DEBUG 使用类似log4net的条件,例如_logger.DebugEnabled 在我看来,在发布版本中,我只返回Nul

我得到了一个非常常见的场景,即一个自我实现的ILogger接口。它包含几种方法,如\u logger.Debug(“一些东西”)等等。该实现由LoggingService提供,并以正常方式在类中使用

现在我有一个关于性能的问题,我正在为WindowsPhone7撰写文章,由于这些设备的功率有限,一些小事情可能很重要

我不想:

  • 在每一行中包含一个预编译器指令,如#IF DEBUG
  • 使用类似log4net的条件,例如_logger.DebugEnabled
在我看来,在发布版本中,我只返回NullLogger,其中包含接口的空实现,什么也不做

问题是:编译器是否认识到这些事情(可能很难,他无法在编译时知道我分配了哪个记录器)。有没有办法给.NET一个提示

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

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

谢谢你的提示,
克里斯

使用:

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

使用:


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

在应用程序中有不“运行”的日志代码可能是一个很小的问题。“null”记录器或条件的开销在方案中可能非常小。字符串将产生内存开销,这可能会让受约束的设备感到担忧,但由于它是WP7,所以最小规格实际上并没有受到约束

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

如果你真的想删除登录代码

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


但是,如果希望使用这种方法,则必须放弃接口设计,因为条件属性不能应用于接口成员,并且不能使用条件成员实现接口

在应用程序中有不“运行”的日志代码可能是一个很小的问题。“null”记录器或条件的开销在方案中可能非常小。字符串将产生内存开销,这可能会让受约束的设备感到担忧,但由于它是WP7,所以最小规格实际上并没有受到约束

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

如果你真的想删除登录代码

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


但是,如果希望使用这种方法,则必须放弃接口设计,因为条件属性不能应用于接口成员,并且不能使用条件成员实现接口

谢谢,我可能会尝试这种方法,并切换到子类化,而不是记录器的接口(反正只有两个)。但我同意,优先级很低,让我们先让应用程序运行起来,不要出错:-)谢谢,我可能会尝试这种方法,然后切换到子类化,而不是记录器的接口(反正只有两个)。但我同意,优先级很低,让我们先让应用程序运行时不出错:-)
[Conditional("DEBUG")]
public void Debug(string message) { /* ... */ }