在C#中编译条件编译符号的时间检查(参见示例)?

时间:2010-09-27 18:36:16

标签: c#

在C / C ++中,您可以执行以下操作:

#define IN_USE      (1)
#define NOT_IN_USE (-1)

#define USING( system ) ( 1 / (system) == 1 / IN_USE )

然后:

#define MY_SYSTEM  IN_USE

#if USING( MY_SYSTEM )
    <my_system impl>
#endif

这种设置意味着:

  • 所有条件编译符号都必须定义为IN_USE或NOT_IN_USE。

  • 我可以将它们全部放在一个头文件(或一对)中,然后轻松打开/关闭它们,看看有哪些条件编译符号。

  • #if USING(MYSYSTEM)之类的拼写错误由编译器捕获,因为div为0而不是默默地编译出来。

是否可以在C#中执行此操作?是否有其他最佳实践方法可以达到同样的效果?

我在C#中意识到你可以通过在项目设置中设置它们并使用#if来进行条件编译,但我不喜欢不需要明确定义某些内容的事实。这就是项目设置中您有“DEBUG”和“TRACE”复选框的原因。如果他们不在那里,你根本不知道你可以打开它们。

3 个答案:

答案 0 :(得分:2)

C#不允许为预处理程序符号提供,但您可以使用#define#ifdef/#endif。通常,预处理程序符号实际上是在项目级别内定义的 项目属性而不是代码。

如果相关的预处理程序符号不存在,您可能也会对ConditionalAttribute感兴趣,它允许调用到用它修饰的方法。 (该方法本身仍然构建;它只是确定是否实际发生了调用。)

如果您想要实际的常量值,可以使用conststatic readonly字段。

答案 1 :(得分:0)

C#没有c预处理器。 它允许您拥有项目范围或文件范围的#define,可以设置为已定义或未定义。您只能在#if /#else块中使用它,并且您的测试仅限于存在/不存在。

因此,在您的情况下,在VisualStudion的项目设置中,在Build下,您将在条件编译符号框中有MY_SYSTEM。

一般来说,如果可能的话,您希望将模块考虑在类定义之上,而不是围绕预处理器的chicanery。

答案 2 :(得分:0)

C#没有预处理器,但编译器足够智能,如果你给它一个常量作为if()条件,它将发出/不发出适当的代码,给出相同的效果。

// in Conditionals.cs
public static class Conditionals
{
     public const bool MY_SYSTEM = true;

}

// In SomeOther.cs
if (Conditionals.MY_SYSTEM)
{
//  <my_system impl>            
}