【问题标题】:#ifdef in C#C#中的#ifdef
【发布时间】:2010-11-01 19:11:58
【问题描述】:

我想用 C# 而不是 C++ 执行以下操作

#ifdef _DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif

【问题讨论】:

  • 检查this excellent answer,它显示了如何通过项目文件(.csproj)根据条件添加调试符号。

标签: c#


【解决方案1】:
#if DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif

确保您在构建属性中选中了用于定义 DEBUG 的复选框。

【讨论】:

    【解决方案2】:

    我建议您使用Conditional Attribute

    更新:3.5 年后

    您可以像这样使用#if (example copied from MSDN):

    // preprocessor_if.cs
    #define DEBUG
    #define VC_V7
    using System;
    public class MyClass 
    {
        static void Main() 
        {
    #if (DEBUG && !VC_V7)
            Console.WriteLine("DEBUG is defined");
    #elif (!DEBUG && VC_V7)
            Console.WriteLine("VC_V7 is defined");
    #elif (DEBUG && VC_V7)
            Console.WriteLine("DEBUG and VC_V7 are defined");
    #else
            Console.WriteLine("DEBUG and VC_V7 are not defined");
    #endif
        }
    }
    

    仅对排除部分方法有用。

    如果您使用#if 从编译中排除某些方法,那么您将不得不从编译中排除调用该方法的所有代码片段(有时您可能会在运行时加载一些类并且您无法找到带有“查找所有参考”)。否则会有错误。

    另一方面,如果您使用条件编译,您仍然可以保留所有调用该方法的代码。所有参数仍将由编译器验证。 该方法不会在运行时被调用。我认为最好只隐藏一次方法,而不必删除所有调用它的代码。您不能在返回值的方法上使用条件属性 - 只能在 void 方法上使用。但我不认为这是一个很大的限制,因为如果您将#if 与返回值的方法一起使用,您必须隐藏所有调用它的代码。

    这是一个例子:

    // 调用 Class1.ConditionalMethod() 将在运行时被忽略 // 除非定义了 DEBUG 常量 使用 System.Diagnostics; 类 Class1 { [条件(“调试”)] 公共静态无效条件方法(){ Console.WriteLine("执行的 Class1.ConditionalMethod"); } }

    总结:

    我会在 C++ 中使用#ifdef,但在 C#/VB 中我会使用 Conditional 属性。这样您就可以隐藏方法定义,而不必隐藏调用它的代码片段。调用代码仍然由编译器编译和验证,但在运行时不会调用该方法。 您可能希望使用#if 来避免依赖关系,因为使用 Conditional 属性,您的代码仍会被编译。

    【讨论】:

    • +1 这确实很好,但有局限性,例如当您尝试从条件方法返回值时(据我了解)。我认为,内联示例会有所帮助。
    • 它也不会阻止代码被编译,它只是不允许该代码。当您想要删除依赖项等时,区别很重要。
    【解决方案3】:

    C# 确实有一个预处理器。它的工作原理与此略有不同 C++ 和 C.

    这是一个 MSDN 链接 - all preprocessor directives 上的部分。

    【讨论】:

    • 这是一个小问题,但 C# 没有预处理器。 # 指令由主编译器处理,就像有一个预处理器一样。见这里:msdn.microsoft.com/en-us/library/ed8yd1ha.aspx 这种区别的主要结果是 c/c++ 风格的宏不起作用。
    【解决方案4】:

    我能够通过将<DefineConstants> 标签添加到 csproj 的 xml 中来实现该行为。

    1. 使用文本编辑器打开项目文件。
    2. 找到包含所有项目属性定义的第一个 <PropertyGroup>
    3. 在该组内添加<DefineConstants>SOME_VARIABLE_NAME</DefineConstants>
    4. #if SOME_VARIABLE_NAME 添加到您的代码以有条件地启用代码。

    【讨论】:

    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2010-12-10
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 2016-06-22
    相关资源
    最近更新 更多