如何在 C# 中执行#ifdef

问题描述 投票:0回答:4

我想执行以下操作,但使用 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
c#
4个回答
168
投票
#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 的复选框。


58
投票

我建议您使用条件属性

更新:3.5年后

您可以像这样使用

#if
从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 常量
    
    
    使用系统诊断;
    等级1级
    {
       [条件(“调试”)]
       公共静态无效条件方法(){
          Console.WriteLine("执行了Class1.ConditionalMethod");
       }
    }

总结:

我会在 C++ 中使用

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


1
投票

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

这里是 MSDN 链接 - 关于所有预处理器指令的部分。


1
投票

我能够通过将

<DefineConstants>
标签添加到 csproj 的 xml 中来实现该行为。

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