Как я могу избежать директив `#if DEBUG` для членов в C #? - PullRequest
0 голосов
/ 29 марта 2019

Я использую в своем классе свойство журнала, предназначенное только для целей отладки.

Примечание: Я не использую какой-либо существующий пакет логгера, поскольку управляю большими списками объектов, каждый из которых имеет свой собственный (!) Журнал.

Поскольку он не используется в режиме выпуска, он заключен в директиву препроцессора:

#if DEBUG
    public List<LogItem> DebugLog { get; }
#endif

К сожалению, мне нужно несколько раз инициализировать и скопировать это свойство, что приводит к грязному коду:

    public MyClass(object parameterA, object parameterB, ...,
#if DEBUG
        , List<LogItem> debugLog
#endif
        ) {
        throw new NotImplementedException();
    }

Хотя для реального ведения журнала я написал метод [Conditional("DEBUG")], я не знаю ни одной возможности избежать этой уродливой и нарушающей идиомы директивы для обозначения аргументов и параметров. Условный атрибут представляется применимым только к свойствам и атрибутам.

Мне интересно, существует ли какой-либо шаблон проектирования для этой проблемы, обеспечивающий лучшую читаемость. Я с нетерпением жду ваших идей!

1 Ответ

2 голосов
/ 29 марта 2019

Взгляните на log4net , который, вероятно, является самым популярным регистратором с открытым исходным кодом для .NET. Одним из многих преимуществ, которые вы увидите, является то, что вы можете настроить регистратор один раз, в своем конфигурационном файле, и иметь различные конфигурации для отладки и выпуска. Таким образом, переключение на выпуск выполняется автоматически, когда вы публикуете веб-сайт или приложение, в вашем коде нет условных указаний и вам не нужно изменять код для учета различных ситуаций.

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