C#中条件编译的替代方法

Ven*_*nki 11 c# conditional-compilation

在C#中使用条件编译代码的替代方法是什么?

我有一个类,有很多基于#ifdef的代码..过了一段时间我的代码是不可读的.

寻找重构技术,以便更好地阅读和维护具有许多#ifdefs 的代码

Jon*_*eet 23

一件事是使用ConditionalAttribute:

[Conditional("DEBUG")]
public void Foo()
{
    // Stuff
}

// This call will only be compiled into the code if the DEBUG symbol is defined
Foo();
Run Code Online (Sandbox Code Playgroud)

它仍然是条件编译,但基于属性而不是#ifdef,这使得它通常更简单.

另一种方法是在执行时使用布尔值,而不是在编译时全部使用.如果您可以向我们提供有关您要实现的内容以及如何使用条件编译的更多详细信息,那将非常有用.


The*_*ing 8

另一种方法是使用ConditionalAttribute.条件属性以类似的方式工作.

#define TRACE_ON
using System;
using System.Diagnostics;

public class Trace 
{
    [Conditional("TRACE_ON")]
    public static void Msg(string msg)
    {
        Console.WriteLine(msg);
    }
}  

public class ProgramClass
{
    static void Main()
    {
        Trace.Msg("Now in Main...");
        Console.WriteLine("Done.");
    }
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ven 6

如果它是代码可读性问题,你可以考虑使用.Net的部分类限定符并将条件代码放在单独的文件中,所以也许你可以有这样的东西......

foo.cs:

public partial class Foo
{
    // Shared Behavior
}
Run Code Online (Sandbox Code Playgroud)

foo.Debug.cs:

#if DEBUG
public partial class Foo
{
    // debug Behavior
}
#endif
Run Code Online (Sandbox Code Playgroud)

foo.bar.cs:

#define BAR
#if BAR
public partial class Foo
{
    // special "BAR" Behavior
}
#endif
Run Code Online (Sandbox Code Playgroud)

我不确定你是否可以在代码文件之外定义条件,所以做这样的事情可能会降低条件定义的灵活性(例如,你可能无法创建针对BAR的条件分支,比如说,主文件,并且必须维护多个定义的BAR可能变得丑陋)以及需要一定的愚蠢去文件以有效地启用/禁用该位代码.

因此,使用这种方法可能最终会引入比它解决的更复杂的问题,但是,根据您的代码,它可能会有所帮助吗?