如何避免为C#中的成员使用#if DEBUG指令?

时间:2019-03-29 11:42:08

标签: c# .net idioms conditional-compilation idiomatic

我在类中使用了一个日志属性,该属性仅用于调试目的。

注意:我不使用任何现有的记录器数据包,因为我管理着大量对象,每个对象都有自己的(!)日志。

由于它不在发布模式下使用,因此由预处理器指令围起来:

#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")]方法,但我不知道有没有任何可能避免这种丑陋且违反习惯用法的指令来注意参数和参数。 ConditionalAttribute似乎仅适用于属性和属性。

我想知道是否存在针对此问题的设计模式,以提高可读性。我期待您的想法!

1 个答案:

答案 0 :(得分:2)

看看log4net,它可能是.NET最受欢迎的开源记录器。您将看到的许多好处之一是,您可以在配置文件中配置一次记录器,并具有用于调试和发布的不同配置。这样,当您发布网站或应用程序时,切换到发布是自动完成的,您的代码中没有条件指令,也不需要更改代码以解决不同情况。