在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”复选框的原因。如果他们不在那里,你根本不知道你可以打开它们。
答案 0 :(得分:2)
C#不允许为预处理程序符号提供值,但您可以使用#define
和#ifdef/#endif
。通常,预处理程序符号实际上是在项目级别内定义的
项目属性而不是代码。
如果相关的预处理程序符号不存在,您可能也会对ConditionalAttribute
感兴趣,它允许调用到用它修饰的方法。 (该方法本身仍然构建;它只是确定是否实际发生了调用。)
如果您想要实际的常量值,可以使用const
和static 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>
}