条件编译 - 逐步淘汰C#中的部分代码

时间:2010-02-05 12:11:39

标签: c# class-design conditional-compilation

我正在开发一个项目,我需要设计一组类来用于项目的一个阶段。

在后续阶段,我们不需要一组类和方法。这些类和方法将在整个应用程序中使用,因此如果我将它们添加为任何其他类,我需要在不需要时手动删除它们。

在C#中是否有一种方法,以便我可以在实例化类的类或地方设置属性,以避免基于属性值的实例化和方法调用。

设置

之类的东西
[Phase = 2]
BridgingComponent bridgeComponent = new BridgeComponent();

在这方面有任何帮助。

5 个答案:

答案 0 :(得分:3)

当C#编译器遇到#if directive,最后是#endif指令时,只有在定义了指定的符号时,它才会在指令之间编译代码。

#define FLAG_1
...
#if FLAG_1
    [Phase = 2]
    BridgingComponent bridgeComponent = new BridgeComponent();
#else
    [Phase = 2]
    BridgingComponent bridgeComponent;
#endif

答案 1 :(得分:2)

听起来像是在问#if

#if Phase2
BridgingComponent bridgeComponent = new BridgeComponent();
#endif

然后,当您希望BridgingComponent包含在构建中时,在编译行上使用/define Phase2,而不是在不构建时使用{{1}}。

答案 2 :(得分:1)

在Properties> build中设置编译标志,例如PHASE1

并在代码中

#if PHASE1
  public class xxxx
#endif

答案 3 :(得分:1)

您还可以使用依赖注入框架,如Spring.NET,NInject等。另一种方法是使用工厂方法来实例化您的类。然后,您将拥有Phase1,Phase2等的工厂类。在后一种情况下,您有运行时选择而不是编译时间。

答案 4 :(得分:1)

关于方法,您可以使用Conditional属性:

// Comment this line to exclude method with Conditional attribute
#define PHASE_1

using System;
using System.Diagnostics;
class Program {

    [Conditional("PHASE_1")]
    public static void DoSomething(string s) {
        Console.WriteLine(s);
    }

    public static void Main() {
        DoSomething("Hello World");
    }
}

好处是,如果未定义符号,则不会编译方法调用。