首页 > 解决方案 > 如何避免 C# 中成员的“#if DEBUG”指令?

问题描述

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

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

由于它不在发布模式下使用,因此它包含在预处理器指令中:

#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似乎仅适用于属性和属性。

我想知道这个问题是否有任何设计模式可以提高可读性。我期待着你的想法!

标签: c#.netconditional-compilationidioms

解决方案


看看log4net,它可能是最流行的 .NET 开源记录器。您将看到的众多好处之一是您可以在配置文件中配置一次记录器,并为调试和发布提供不同的配置。这样,当您发布网站或应用程序时,会自动切换到发布,您的代码中没有条件指令,并且您无需更改代码以适应不同的情况。


推荐阅读