ILogger _logger.Debug ("Something") - Есть ли способ для компилятора удалить его? - PullRequest
1 голос
/ 20 ноября 2010

У меня довольно распространенный сценарий, а именно самореализованный интерфейс ILogger.Он содержит несколько методов, таких как _logger.Debug («Некоторые вещи») и так далее.Реализация обеспечивается LoggingService и используется в классах обычным способом.

Теперь у меня есть вопрос относительно производительности, я пишу для Windows Phone 7, и из-за ограниченной мощности этих устройств мелочиможет иметь значение.

Я не хочу:

  • Включить в каждую строку директиву прекомпилятора, например #IF DEBUG
  • Использовать условие, например log4net, например _logger.DebugEnabled

Насколько я понимаю, в версии выпуска я просто возвращаю NullLoggers, которые содержат пустую реализацию интерфейса, ничего не делая.

Вопрос:Компилятор распознает такие вещи (может быть трудно, он не может знать во время компиляции, какой регистратор я назначаю).Есть ли способ дать подсказку .NET для этого?

Причина моего вопроса, я знаю, что ввод пустой функции не вызовет большой задержки, никаких проблем там нет.Но в исходном коде моего приложения много строк, и, если они никогда не используются, они не обязательно должны быть частью моего приложения ...

Или я задумался над крошечной проблемой (возможно, соотношение «строка-код» просто ужасно выглядит в моем редакторе кода, и в любом случае это не имеет большого значения) ..

Спасибо за советы,
Крис

Ответы [ 2 ]

9 голосов
/ 20 ноября 2010

Используйте атрибут Условный :

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

Компилятор удалит все вызовы этого метода для любых конфигураций сборки, которые не соответствуют строке в условном атрибуте.Обратите внимание, что этот атрибут применяется к методу , а не к сайту вызова.Также обратите внимание, что удаляется инструкция сайта вызова , а не сам метод.

1 голос
/ 20 ноября 2010

Вероятно, очень маловероятно, чтобы в вашем приложении не регистрировался код ведения журнала. Затраты на «нулевой» логгер или условные выражения, вероятно, будут очень малы в схеме вещей. Строки будут вызывать накладные расходы памяти, что может беспокоить ограниченное устройство, но, поскольку это WP7, минимальные спецификации не настолько ограничены в реальности.

Я понимаю, что код регистрации выглядит странно. :)

Если вы действительно хотите удалить этот код регистрации ...

В .Net вы можете использовать ConditionalAttribute для маркировки методов условной компиляции. Вы можете использовать эту функцию, чтобы гарантировать, что все вызовы журналов удаляются из компиляции для указанных конфигураций сборки. Пока методы, которые вы украсили с помощью условных атрибутов, следуют нескольким правилам, компилятор буквально удаляет цепочку вызовов.

Однако, если вы хотите использовать этот подход, вам придется отказаться от дизайна интерфейса, поскольку условный атрибут не может быть применен к элементам интерфейса, и вы не можете реализовать интерфейсы с условными элементами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...